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

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

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

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

Ответ 1

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

Автор реализовал 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);
            }
        }
    }
}

Ответ 2

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

UPDATE

Начиная с 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);
    }

}