我使用Jersey 2.4創建了一個提供JSON對象的簡單REST接口。我的問題是,我試圖使用更快的xml傑克遜註釋來控制輸出,這不適合我。我已將註釋放入我的bean類中,但它們被忽略。使用Jackson ObjectMapper和Jersey
當我顯式創建一個ObjectMapper並使用它來對Java bean進行字符串化時,我得到了我想要的輸出,它尊重了Jackson註釋。然而,我寧願我不必這樣做,這樣我的資源類就可以簡單地返回bean,而Jersey框架負責對它進行字符串化。
我試圖解決這個使用從Custom ObjectMapper with Jersey 2.2 and Jackson 2.1的答案,但是,這似乎並不適用於我。我看到ContextResolver已經創建,但從未被調用過。
我也花了很多時間試圖解決這個顯然很簡單的問題。我已經把它解釋成一個非常簡單的測試用例,如下所示。我將不勝感激任何幫助解決此問題。
資源的Java類:
@Path("resource")
public class MainResource {
public static class Foobar {
@JsonIgnore
private String foo = "foo";
private String baa = "baa";
private Map<String, List<? extends Number>> map = new HashMap<>();
public Foobar() {
map.put("even", Arrays.asList(new Integer[] { 2, 4, 6, 8, 10 }));
map.put("odd", Arrays.asList(new Integer[] { 1, 3, 5, 7, 9 }));
map.put("float", Arrays.asList(new Float[] { 1.1F, 2.2F, 3.3F }));
}
public String getFoo() {
return foo;
}
public void setFoo(String foo) {
this.foo = foo;
}
public String getBaa() {
return baa;
}
public void setBaa(String baa) {
this.baa = baa;
}
@JsonAnyGetter
public Map<String, List<? extends Number>> getMap() {
return map;
}
public void setMap(Map<String, List<? extends Number>> map) {
this.map = map;
}
}
private ObjectMapper om = new ObjectMapper();
@GET
@Path("get-object")
@Produces(MediaType.APPLICATION_JSON)
public Foobar getObject() {
// In this method, I simply return the bean object but the WRONG JSON syntax is generated.
return new Foobar();
}
@GET
@Path("get-string")
@Produces(MediaType.APPLICATION_JSON)
public String getString() throws JsonProcessingException {
// This method returns the RIGHT JSON syntax but I don't want to have to explicitly use the ObjectMapper.
Foobar foobar = new Foobar();
return om.writeValueAsString(foobar);
}
}
的web.xml:
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<module-name>sample</module-name>
<servlet>
<servlet-name>Jersey Web Application</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>ie.cit.nimbus.sample</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>Jersey Web Application</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
</web-app>
POM依賴關係:
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson.jaxrs</groupId>
<artifactId>jackson-jaxrs-json-provider</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.ext</groupId>
<artifactId>jersey-spring3</artifactId>
<version>2.4.1</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.4.1</version>
</dependency>
</dependencies>
謝謝。我嘗試過,但似乎沒有任何區別。它仍然忽略fasterxml註釋併產生錯誤的JSON輸出。還有什麼我需要改變? – jcstockdale
你能給我你正在嘗試使用的具體註釋嗎?我將設置一個測試用例。 –
你的意思是JsonIgnore註釋?嘗試把它放在吸氣劑和/或制定者而不是私人領域。 –