Jersey 2.0和Moxy内部服务器错误但没有服务器日志

时间:2013-07-16 03:17:15

标签: json jersey jax-rs pojo moxy

我按照Jersey 2.0文档(https://jersey.java.net/documentation/latest/user-guide.html#json.moxy),修改了pom.xml,包含了jersey-media-moxy工件,编译和安装。我可以为Produces和Consumes案例获得基本的POJO到JSON映射工作。

但是,当我尝试使用复杂数据类型的某些POJO作为资源返回类型时,我得到了很多状态500内部服务器错误但没有任何服务器日志。这很烦人。有人知道这是一个错误还是我在配置中遗漏了什么?

顺便说一句,为了对POJO对象使用Moxy映射,POJO需要有一个空参数构造函数。还有其他要求吗?

2 个答案:

答案 0 :(得分:5)

我遇到了同样的问题并发现了这篇文章:

作者实现了ApplicationEventListener来记录Moxy抛出的异常。这是我的实现(需要在您的应用程序中注册):

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);
            }
        }
    }
}

答案 1 :(得分:1)

可以在以下链接中找到演示如何集成Jersey的官方EclipseLink MOXy示例:

在哪里可以找到内部服务器错误的堆栈跟踪取决于您的设置,您能否提供有关您的设置的其他信息?

如果我从org.glassfish.jersey.examples.jsonmoxy.TestBean类中删除默认构造函数,请使用上面的示例,运行mvn test时会出现以下异常。其中一个是好的,另一个是坏的。我将跟进泽西岛的领导,以找出正确的行为。

不良例外

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)

良好例外

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)

<强>更新

从EclipseLink 2.5.1开始,您可以使用MOXyJsonProvider standalone来测试您的模型。

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);
    }

}