Ich verwende Jersey 2.4, um eine einfache REST-Schnittstelle zu erstellen, die ein JSON-Objekt bereitstellt. Mein Problem ist, dass ich versuche, die fasterxml Jackson Annotationen zu verwenden, um die Ausgabe zu steuern, und das funktioniert nicht für mich. Ich habe die Anmerkungen in meine Bean-Klasse geschrieben, aber sie werden ignoriert.Verwenden von Jackson ObjectMapper mit Jersey
Wenn ich explizit einen ObjectMapper erstellen und diese verwenden, um die Java-Bean zu stringieren, bekomme ich die Ausgabe, die ich will, die die Jackson-Anmerkungen respektiert. Ich würde jedoch bevorzugen, dass ich diesen Schritt nicht tun muss, so dass meine Ressourcenklasse einfach die Bohne zurückgeben kann und das Jersey-Framework dafür sorgt, dass sie stringifiziert wird.
Ich habe versucht, dies zu lösen mit der Antwort von Custom ObjectMapper with Jersey 2.2 and Jackson 2.1, scheint dies jedoch nicht für mich arbeiten. Ich sehe, dass der ContextResolver erstellt wird, aber nie aufgerufen wird.
Ich habe auch viele Stunden damit verbracht, dieses scheinbar einfache Problem zu lösen. Ich habe dies auf einen sehr einfachen Testfall reduziert, der unten gezeigt wird. Ich würde jede Hilfe bei der Lösung dieses Problems zu schätzen wissen.
Ressourcen Java-Klasse:
@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 Abhängigkeiten:
<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>
Dank rüttelt. Ich habe es versucht, aber es scheint keinen Unterschied gemacht zu haben. Es ignoriert weiterhin die fasterxml-Annotationen und erzeugt die falsche JSON-Ausgabe. Gibt es noch etwas, das ich ändern muss? – jcstockdale
Können Sie mir die spezifischen Anmerkungen geben, die Sie verwenden möchten? Ich werde einen Testfall einrichten. –
Meinst du die JsonIgnore Annotation? Versuchen Sie es auf den Getter und/oder den Setter nicht das private Feld. –