Джерси 2.0 и внутренняя ошибка сервера Moxy, но нет журнала сервера

Я следил за документом Джерси 2.0 (https://jersey.java.net/documentation/latest/user-guide.html#json.moxy), изменен pom.xml, включен артефакт jersey-media-moxy, скомпилирован и установлен. Я мог получить базовую работу по отображению POJO в JSON как для случаев Produces, так и для Consumes.

Однако, когда я попытался использовать некоторые POJO со сложным типом данных в качестве типа возвращаемого ресурса, я получил много ошибок внутреннего сервера состояния 500, но без какого-либо журнала сервера. Это очень раздражает. Кто-нибудь знает, это баг или я что-то пропустил в настройках?

Кстати, чтобы использовать отображение Moxy для объекта POJO, POJO должен иметь пустой конструктор параметров. Есть ли другие требования?


person David Bao    schedule 16.07.2013    source источник
comment
См. мой ответ   -  person Mordechai    schedule 30.11.2016


Ответы (2)


У меня была такая же проблема, и я нашел этот пост:

Автор реализовал 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);
            }
        }
    }
}
person gesundkrank    schedule 11.03.2014
comment
Спасибо, это действительно помогло мне. - person wvdz; 28.09.2014

Официальные примеры Джерси, которые демонстрируют, как интегрировать 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 автономно для тестирования своей модели.

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

}
person bdoughan    schedule 16.07.2013
comment
Спасибо за ваш ответ. Я развернул свое приложение как сервлет на сервер Jetty, следуя этому документу (jersey.java.net/documentation/latest/). Я также попробовал тот же сервлет с сервером Tomcat. Ни один из серверов не имеет журнала сервера в stdout или файлах журнала сервера при возврате ошибки 500 Internal Server. - person David Bao; 18.07.2013
comment
Недавно в Джерси появилась ошибка, отслеживающая эту проблему с отсутствующим журналом: java.net/jira/browse/JERSEY-2000. - person David Bao; 02.08.2013