2015-10-31 12 views
1

我想讓JAXRS將特定類屬性的所有json細節推送到JsonObject對象中。獲取JAX-RS服務以創建具有JsonObject屬性的對象

比方說,我有下面的類:

public class MyMessage implements Serializable { 

    private PayloadType payloadType;  

    private JsonObject payload; 
} 

REST方法:

@POST 
@Path("/send") 
@Consumes(MediaType.APPLICATION_JSON) 
public Response send(MyMessage message) 

我想發佈以下JSON,但有​​屬性設置爲javax.json.JsonObject對象。

{ 
    payloadType:'MESSAGE', 
    payload:{ 
     subject:"My Subject", 
     body:"This is a message" 
    } 
} 

我Glassfish上運行,所以我期待爲JsonObject該消息的讀者都包含org.glassfish.jersey.media,這是包含在GF4.1支持。添加下面的maven依賴只會導致模糊的類異常。

<dependency> 
    <groupId>org.glassfish.jersey.media</groupId> 
    <artifactId>jersey-media-json-processing</artifactId> 
    <version>2.22.1</version> 
</dependency> 

回答

0

所以有幾件事阻止你在這裏。

  1. javax.json(或JSONP)不處理POJO。它只處理javax.json API。如果您期望的是原始提供程序處理POJO,而JSONP提供程序處理javax.json,則它不會像那樣工作。要麼你將使用處理的POJO的一個(不知道javax.json或者您使用的處理javax.json之一。(我們做雖然:-)

  2. GlassFish的默認提供莫西下面這一點。所以我們需要禁用使用任何其他供應商。要禁用莫西,你需要這個屬性

    ServerProperties.MOXY_JSON_FEATURE_DISABLE

    設置爲true。無論是在你的web.xml或您的Java配置。

所以要做到這一點,我們應該確保我們使用的是傑克遜。傑克遜有jackson-datatype-jsr353模塊,它允許你正在做什麼,POJO中的javax.json

Glassfish已經有傑克遜提供商,但是您應該在provided範圍內添加它。所以,如果柳講究版本,我使用包含在Glassfish的4.1版本相同的添加這兩個依賴

<dependency> 
    <groupId>org.glassfish.jersey.media</groupId> 
    <artifactId>jersey-media-json-jackson</artifactId> 
    <version>2.10.4</version> 
    <scope>provided</scope> 
</dependency> 
<dependency> 
    <groupId>com.fasterxml.jackson.datatype</groupId> 
    <artifactId>jackson-datatype-jsr353</artifactId> 
    <version>2.3.3</version> 
</dependency> 

。它使用澤西島2.10.4和傑克遜2.3.3。你想要版本衝突。儘管提供了jersey-media-json-jackson,但在編譯時嘗試使用與服務器相同的版本仍然是一個好主意。

此外,您應該在您的應用程序中註冊JacksonFeature

我們需要的最後一件事是註冊JSR353Module,以便我們可以得到Jackson的javax.json支持。要做到這一點,只需在應用程序中註冊以下提供商。

@Provider 
public class ObjectMapperProvider implements ContextResolver<ObjectMapper> { 

    private final ObjectMapper mapper; 

    public ObjectMapperProvider() { 
     mapper = new ObjectMapper(); 
     mapper.registerModule(new JSR353Module()); 
    } 

    @Override 
    public ObjectMapper getContext(Class<?> type) { 
     return mapper; 
    } 
} 

就是這樣。我測試過了,它應該可以工作。

+0

我的開始條件可能有點不同(例如我的POJO類中有@JsonProperty註釋的變量),但唯一缺少的是:「您還應該在您的應用程序中註冊JacksonFeature。」 Sth like: public class JerseyConfiguration extends ResourceConfig { public JerseyConfiguration(){ packages(「your.packages」); 寄存器(JacksonFeature.class); } } – flexus

相關問題