2017-06-27 3 views
0

Ich bin mit Glassfish 4.1.2Glassfish JAX-RS POJO zu JSON Serialisierung nicht

Ich habe ein JAX-RS-Endpunkt, dass ich von meiner POJO Einheit serialisiert ein JSON-Objekt zurückgeben möchten.

Die POJO:

@XmlRootElement 
public class MyObj { 

    public MyObj() {} 

    private String value; 

    public String getValue() { 
     return value; 
    } 

    public void setValue(String value) { 
     this.value = value; 
    } 

} 

Die Ressource:

@Path("/something") 
public class MyResource { 

    @GET 
    @Produces(MediaType.APPLICATION_JSON) 
    public MyObj getMyObject() { 
     MyObj myObj = new MyObj(); 
     myObj.setValue("Some Value"); 
     return myObj; 
    } 

} 

Erzeugt zwei Ausnahmen: Der erste wird ausgelöst, wenn die Ressource zuerst zugegriffen wird, nachdem der Server gestartet wird:

javax.servlet.ServletException: org.glassfish.jersey.server.ContainerException: java.lang.NoClassDefFoundError: javax/xml/parsers/ParserConfigurationException 

Alle nachfolgenden Anforderungen erzeugen die Ausnahme:

javax.servlet.ServletException: org.glassfish.jersey.server.ContainerException: java.lang.NoClassDefFoundError: Could not initialize class org.eclipse.persistence.jaxb.BeanValidationHelper 

Wenn ich jedoch das Ergebnis als XML (d. H. Ich ändere zu @Produces(MediaType.APPLICATION_XML)) es funktioniert ohne Ausnahme und die XML zurückgegeben wird keine Probleme.

Meine Anfrage Header akzeptiert sowohl XML und JSON.

UPDATE

Mein Projekt Abhängigkeiten sind:

javax:javaee-api:7.0 
com.lambdaworks:scrypt:1.4.0 
commons-codec:commons-codec:1.10 
org.apache.commons:commons-lang3:3.6 

Ich habe im Grunde dieses Projekt bis auf die nackten Knochen abgestreift.

UPDATE 2

Beratung von @peeskillet von jersey.config.server.disableMoxyJson, true auf die Anwendungseigenschaften der Karte hinzugefügt Nach tut Art von Arbeit:

@ApplicationPath("") 
public class MyServer extends Application { 

    @Override 
    public Map<String, Object> getProperties() { 
     Map<String, Object> map = new HashMap<>(); 
     map.put("jersey.config.server.disableMoxyJson", true); 
     return map; 
    } 

} 

Die ursprüngliche Anforderung schlägt mit:

javax.servlet.ServletException: org.glassfish.jersey.server.ContainerException: java.lang.NoClassDefFoundError: com/fasterxml/jackson/module/jaxb/JaxbAnnotationIntrospector 

ABER dann funktionieren alle nachfolgenden Anfragen und ich kann den JSON in der Antwort bekommen.

Ich bin ein wenig besorgt, dass es zunächst fehlschlägt.

+0

Welche Gläser/Abhängigkeiten werden Sie für Ihr Projekt? –

+0

@peeskillet siehe mein Update – Neilos

+1

Was passiert, wenn Sie Jackson anstelle des Standard-MOXy für die JSON-Verarbeitung verwenden? Wenn Sie eine 'Application'-Unterklasse für Ihre JAX-RS-Konfiguration verwenden, überschreiben Sie [getProperties] (http://docs.oracle.com/javaee/7/api/javax/ws/rs/core/Application.html#getProperties -) und fügen Sie eine Eigenschaft mit dem Schlüssel '" jersey.config.server.provider.classnames "' und dem Wert '" org.glassfish.jersey.jackson.JacksonFeature "' –

Antwort

0

Ich konnte dies nicht richtig mit Glassfish 4.1.2, ich wechselte zu WildFly 10.1.0.Final und es hat sofort funktioniert.

UPDATE

dazu Kommen wir zurück konnte ich Glassfish mit Jackson zum Laufen bringen.

Es scheint, dass java.lang.NoClassDefFoundError: com/fasterxml/jackson/module/jaxb/JaxbAnnotationIntrospector ist, weil Glassfish 4.1.2 nicht mit einem jackson-module-jaxb-annotations.jar gebündelt ist.

Die Lösung ist die jackson-module-jaxb-annotations.jar-<glassfish install>/glasfish4/glassfish/modules

Dann deaktivieren Moxy mit hinzuzufügen:

@ApplicationPath ("")

public class MyServer extends Application { 

    @Override 
    public Map<String, Object> getProperties() { 
     Map<String, Object> map = new HashMap<>(); 
     map.put("jersey.config.server.disableMoxyJson", true); 
     return map; 
    } 

}