我按照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需要有一个空参数构造函数。还有其他要求吗?
答案 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);
}
}