2013-07-16 5 views
11

Ich folgte der Jersey 2.0 Dokument (https://jersey.java.net/documentation/latest/user-guide.html#json.moxy), modifizierte pom.xml, enthalten Jersey-Media-Moxy-Artefakt, kompiliert und installiert. Ich könnte grundlegende POJO zu JSON-Mapping-Arbeit für beide Fälle zu produzieren und zu konsumieren bekommen.Jersey 2.0 und Moxy Interner Server Fehler aber kein Server Log

Wenn ich jedoch mit einigen POJO mit komplexen Datentyp als Ressource Rückgabetyp versuchte, bekam ich viel Status 500 Interner Serverfehler, aber ohne Serverprotokoll. Es ist sehr nervig. Weiß jemand, ob es ein Bug ist oder ich etwas in der Konfiguration verpasst habe?

Übrigens, um Moxy-Mapping für ein POJO-Objekt zu verwenden, muss das POJO einen leeren Parameterkonstruktor haben. Gibt es noch andere Anforderungen?

+0

See [meine Antwort] (http://stackoverflow.com/a/40896460/1751640) – Mordechai

Antwort

1

Die offiziellen Jersey Beispiele, die zeigen, wie EclipseLink MOXy integrieren können unter folgendem Link zu finden:

Wo finden Sie die Stacktrace für den internen Server-Fehler hängt von Ihrem Setup abhängig Kannst du zusätzliche Informationen über deine geben?

Mit dem obigen Beispiel, wenn ich den Standardkonstruktor aus der org.glassfish.jersey.examples.jsonmoxy.TestBean Klasse entfernen, erhalte ich die folgenden Ausnahmen beim Ausführen von mvn test. Einer von ihnen ist gut und der andere ist schlecht. Ich werde mit der Jersey-Leitung weitermachen, um das richtige Verhalten herauszufinden.

Bad Ausnahme

testGet(org.glassfish.jersey.examples.jsonmoxy.JsonResourceTest) Time elapsed: 0.507 sec <<< ERROR! 
javax.ws.rs.InternalServerErrorException: HTTP 500 Internal Server Error 
    at org.glassfish.jersey.client.JerseyInvocation.convertToException(JerseyInvocation.java:904) 
    at org.glassfish.jersey.client.JerseyInvocation.translate(JerseyInvocation.java:749) 
    at org.glassfish.jersey.client.JerseyInvocation.access$500(JerseyInvocation.java:88) 
    at org.glassfish.jersey.client.JerseyInvocation$2.call(JerseyInvocation.java:650) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:228) 
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:426) 
    at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:646) 
    at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:375) 
    at org.glassfish.jersey.client.JerseyInvocation$Builder.get(JerseyInvocation.java:275) 
    at org.glassfish.jersey.examples.jsonmoxy.JsonResourceTest.testGet(JsonResourceTest.java:76) 

Gut Ausnahme

roundTripTest(org.glassfish.jersey.examples.jsonmoxy.JsonResourceTest) Time elapsed: 0.048 sec <<< ERROR! 
javax.ws.rs.WebApplicationException: HTTP 500 Internal Server Error 
    at org.eclipse.persistence.exceptions.JAXBException.factoryMethodOrConstructorRequired(JAXBException.java:144) 
    at org.eclipse.persistence.jaxb.compiler.AnnotationsProcessor.finalizeProperties(AnnotationsProcessor.java:896) 
    at org.eclipse.persistence.jaxb.compiler.AnnotationsProcessor.processClassesAndProperties(AnnotationsProcessor.java:282) 
    at org.eclipse.persistence.jaxb.compiler.Generator.<init>(Generator.java:150) 
    at org.eclipse.persistence.jaxb.JAXBContext$TypeMappingInfoInput.createContextState(JAXBContext.java:1017) 
    at org.eclipse.persistence.jaxb.JAXBContext.<init>(JAXBContext.java:174) 
    at org.eclipse.persistence.jaxb.JAXBContextFactory.createContext(JAXBContextFactory.java:165) 
    at org.eclipse.persistence.jaxb.JAXBContextFactory.createContext(JAXBContextFactory.java:152) 
    at org.eclipse.persistence.jaxb.JAXBContextFactory.createContext(JAXBContextFactory.java:112) 
    at org.eclipse.persistence.jaxb.JAXBContextFactory.createContext(JAXBContextFactory.java:102) 
    at org.eclipse.persistence.jaxb.rs.MOXyJsonProvider.getJAXBContext(MOXyJsonProvider.java:302) 
    at org.eclipse.persistence.jaxb.rs.MOXyJsonProvider.writeTo(MOXyJsonProvider.java:787) 
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo(WriterInterceptorExecutor.java:194) 
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:139) 
    at org.glassfish.jersey.filter.LoggingFilter.aroundWriteTo(LoggingFilter.java:268) 
    at org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:139) 
    at org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(MessageBodyFactory.java:1005) 
    at org.glassfish.jersey.client.ClientRequest.writeEntity(ClientRequest.java:430) 
    at org.glassfish.jersey.client.HttpUrlConnector._apply(HttpUrlConnector.java:290) 
    at org.glassfish.jersey.client.HttpUrlConnector.apply(HttpUrlConnector.java:203) 
    at org.glassfish.jersey.client.ClientRuntime.invoke(ClientRuntime.java:215) 
    at org.glassfish.jersey.client.JerseyInvocation$2.call(JerseyInvocation.java:650) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:315) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:297) 
    at org.glassfish.jersey.internal.Errors.process(Errors.java:228) 
    at org.glassfish.jersey.process.internal.RequestScope.runInScope(RequestScope.java:426) 
    at org.glassfish.jersey.client.JerseyInvocation.invoke(JerseyInvocation.java:646) 
    at org.glassfish.jersey.client.JerseyInvocation$Builder.method(JerseyInvocation.java:402) 
    at org.glassfish.jersey.client.JerseyInvocation$Builder.post(JerseyInvocation.java:305) 
    at org.glassfish.jersey.examples.jsonmoxy.JsonResourceTest.roundTripTest(JsonResourceTest.java:84) 

UPDATE

Beginnend mit EclipseL Tinte 2.5.1 können Sie MOXyJsonProvider Standalone verwenden, um Ihr Modell zu testen.

import java.lang.reflect.Field; 
import java.util.*; 
import org.eclipse.persistence.jaxb.rs.MOXyJsonProvider; 

public class Demo { 

    private List<Foo> foos; 

    public static void main(String[] args) throws Exception { 
     MOXyJsonProvider moxyJsonProvider = new MOXyJsonProvider(); 

     Field field = Demo.class.getDeclaredField("foos"); 

     List<Foo> foos = new ArrayList<Foo>(1); 
     Foo foo = new Foo(); 
     foo.setBar("Hello World"); 
     foos.add(foo); 

     moxyJsonProvider.writeTo(foos, field.getType(), field.getGenericType(), null, null, null, System.out); 
    } 

} 
+0

Vielen Dank für Ihre Antwort. Ich habe meine App als Servlet zu Jetty-Server bereitgestellt, indem ich dieses Dokument (https://jersey.java.net/documentation/latest/modules-and-dependencies.html#server-jdk) befolge. Ich habe auch das gleiche Servlet mit Tomcat Server ausprobiert. Kein Server hat Server-Log-out-Standard oder Server-Log-Dateien, wenn er 500 Internal Server Fehler zurückgibt. –

+3

Jersey hat kürzlich einen Bug, der dieses fehlende Log-Problem aufspürt: https://java.net/jira/browse/JERSEY-2000 –

5

hatte ich das gleiche Problem und fanden diesen Beitrag:

Der Autor ApplicationEventListener implementiert, um die Ausnahmen von Moxy geworfen zu protokollieren. Dies ist meine Implementierung (muss in der Anwendung registriert werden):

public class ExceptionListener implements ApplicationEventListener { 

    @Override 
    public void onEvent(ApplicationEvent event) { 

    } 

    @Override 
    public RequestEventListener onRequest(RequestEvent requestEvent) { 
     return new ExceptionRequestEventListener(); 
    } 

    public static class ExceptionRequestEventListener implements RequestEventListener{ 
     private final Logger logger; 

     public ExceptionRequestEventListener(){ 
      logger = Logger.getLogger(getClass()); 
     } 

     @Override 
     public void onEvent(RequestEvent event) { 
      switch (event.getType()){ 
       case ON_EXCEPTION: 
        Throwable t = event.getException(); 
        logger.error("Found exception for requestType: "+event.getType(), t); 
      } 
     } 
    } 
} 
+0

Thx, das hat mir wirklich geholfen. – wvdz