Джерси Мокси не может отправить JSON ответ с JAXB - PullRequest
0 голосов
/ 11 апреля 2020

Я недавно обновил свою рабочую среду с Tomcat 8.5, JDK 1.7, Джерси 2.22.1 до Tomcat 9, JDK 10, Джерси 2.30.1 (и использую jersey-media-moxy-2.30.1). REST отлично работает в В большинстве случаев, кроме одного ниже, здесь я получаю ошибку 404 при использовании application / json (отлично работает с application / xml)

    @GET
    @Path("/rest/MyServerStats")
    @Produces({MediaType.APPLICATION_JSON, MediaType.APPLICATION_XML})
    public JAXBElement<ClassBase> getServerStatsObject()
        throws Exception
    {
        JAXBElement<ClassBase> obj = getStatsObject("Server", "Server1");   
        return obj;
    }

В приведенном выше методе, если я изменяю тип возвращаемого значения на List> и внесите изменения ниже, тогда он будет работать как с приложением / json, так и с приложением / xml.

        List<JAXBElement<ClassBase>> list = new ArrayList<JAXBElement<ClassBase>>();
        list.add(obj);
        return list;

Ниже приведен веб-сайт. xml используется для того же.

<?xml version="1.0"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/j2ee/dtds/web-app_2_3.dtd">

<web-app>
    <listener>
        <listener-class>
            com.sun.xml.ws.transport.http.servlet.WSServletContextListener
        </listener-class>
    </listener>

    <servlet>
        <servlet-name>TestData</servlet-name>
        <servlet-class>com.sun.xml.ws.transport.http.servlet.WSServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>TestData</servlet-name>
        <url-pattern>/TestData</url-pattern>
    </servlet-mapping>

    <servlet>
        <servlet-name>rest</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>com.ws.rest</param-value>
        </init-param>
        <init-param>
            <param-name>jersey.config.server.provider.classnames</param-name>
            <param-value>org.glassfish.jersey.moxy.json.MoxyJsonFeature</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>rest</servlet-name>
        <url-pattern>/rest/*</url-pattern>
    </servlet-mapping>

    <session-config>
        <session-timeout>5</session-timeout>
    </session-config>
</web-app>

Может ли кто-нибудь помочь мне понять, в чем может быть проблема, поскольку все это работало до обновления среды.

Я выполнил некоторую отладочную трассировку и сопоставление исключений, поэтому проблема с точками находится в коде постоянства затмения moxy.

X-Jersey-Tracing-008: INVOKE      [17.62 / 25.48 ms | 52.04 %] Resource [com.ws.rest.Resource @6b5edcf5] method=[public javax.xml.bind.JAXBElement com.ws.rest.Resource.getStatsObject() throws com.ws.rest.MyException]
X-Jersey-Tracing-009: INVOKE      [ ---- / 25.60 ms |  ---- %] Response: [org.glassfish.jersey.message.internal.OutboundJaxrsResponse @6f615546 <200/SUCCESSFUL|OK|javax.xml.bind.JAXBElement @2a63d6ce>]
X-Jersey-Tracing-010: RESP-FILTER [ 0.00 / 25.87 ms |  0.01 %] Response summary: 0 filters
X-Jersey-Tracing-011: WI          [ 0.00 / 25.99 ms |  0.01 %] [org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor @7d5b2f4e #10] BEFORE context.proceed()
X-Jersey-Tracing-012: WI          [ 0.01 / 26.02 ms |  0.04 %] [org.glassfish.jersey.server.internal.JsonWithPaddingInterceptor @537c8425 #4100] BEFORE context.proceed()
X-Jersey-Tracing-013: MBW         [ ---- / 26.21 ms |  ---- %] Find MBW for type=[javax.xml.bind.JAXBElement] genericType=[[sun.reflect.generics.reflectiveObjects.ParameterizedTypeImpl @446e2f37]] mediaType=[[org.glassfish.jersey.message.internal.AcceptableMediaType @627353a]] annotations=[@javax.ws.rs.GET(), @javax.ws.rs.Path(value="/stats/DHCPServer"), @javax.ws.rs.Produces(value={"application/xml", "application/json"})]
X-Jersey-Tracing-014: MBW         [ ---- / 26.39 ms |  ---- %] [org.glassfish.jersey.moxy.json.internal.ConfigurableMoxyJsonProvider @2e088452] IS writeable
X-Jersey-Tracing-015: MBW         [ 5.95 / 32.40 ms | 17.58 %] WriteTo by [org.glassfish.jersey.moxy.json.internal.ConfigurableMoxyJsonProvider @2e088452]
X-Jersey-Tracing-016: WI          [ 0.00 / 32.46 ms |  0.01 %] [org.glassfish.jersey.server.internal.JsonWithPaddingInterceptor @537c8425 #4100] AFTER context.proceed()
X-Jersey-Tracing-017: WI          [ 0.00 / 32.47 ms |  0.01 %] [org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor @7d5b2f4e #10] AFTER context.proceed()
X-Jersey-Tracing-018: WI          [ 6.52 / 32.48 ms | 19.24 %] WriteTo summary: 2 interceptors
X-Jersey-Tracing-019: EXCEPTION   [ 0.40 / 33.01 ms |  1.17 %] Exception mapper [com.ws.rest.MyException @55d441ea] maps [javax.ws.rs.WebApplicationException @75fd5b17 <500/SERVER_ERROR|Internal Server Error|-no-entity->] ('HTTP 500 Internal Server Error') to <500/SERVER_ERROR|Internal Server Error>
X-Jersey-Tracing-020: RESP-FILTER [ 0.00 / 33.15 ms |  0.01 %] Response summary: 0 filters
X-Jersey-Tracing-021: WI          [ 0.00 / 33.23 ms |  0.01 %] [org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor @7d5b2f4e #10] BEFORE context.proceed()
X-Jersey-Tracing-022: WI          [ 0.01 / 33.44 ms |  0.03 %] [org.glassfish.jersey.server.internal.JsonWithPaddingInterceptor @537c8425 #4100] BEFORE context.proceed()
X-Jersey-Tracing-023: MBW         [ ---- / 33.53 ms |  ---- %] Find MBW for type=[java.lang.String] genericType=[java.lang.String] mediaType=[[org.glassfish.jersey.message.internal.AcceptableMediaType @627353a]] annotations=[]
X-Jersey-Tracing-024: MBW         [ ---- / 33.60 ms |  ---- %] [org.glassfish.jersey.message.internal.StringMessageProvider @1a19bad6] IS writeable
X-Jersey-Tracing-025: MBW         [ 0.18 / 33.79 ms |  0.53 %] WriteTo by [org.glassfish.jersey.message.internal.StringMessageProvider @1a19bad6]
X-Jersey-Tracing-026: WI          [ 0.00 / 33.83 ms |  0.00 %] [org.glassfish.jersey.server.internal.JsonWithPaddingInterceptor @537c8425 #4100] AFTER context.proceed()
X-Jersey-Tracing-027: WI          [ 0.00 / 33.85 ms |  0.00 %] [org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor @7d5b2f4e #10] AFTER context.proceed()
X-Jersey-Tracing-028: WI          [ 0.64 / 33.85 ms |  1.88 %] WriteTo summary: 2 interceptors
X-Jersey-Tracing-029: FINISHED    [ ---- / 33.87 ms |  ---- %] Response status: 500/SERVER_ERROR|Internal Server Error

Исключение в мокси

org.eclipse.persistence.jaxb.rs.MOXyJsonProvider.writeTo(MOXyJsonProvider.java:978)
org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.invokeWriteTo(WriterInterceptorExecutor.java:242)
org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo(WriterInterceptorExecutor.java:227)
org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:139)
org.glassfish.jersey.server.internal.JsonWithPaddingInterceptor.aroundWriteTo(JsonWithPaddingInterceptor.java:85)
org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:139)
org.glassfish.jersey.server.internal.MappableExceptionWrapperInterceptor.aroundWriteTo(MappableExceptionWrapperInterceptor.java:61)
org.glassfish.jersey.message.internal.WriterInterceptorExecutor.proceed(WriterInterceptorExecutor.java:139)
org.glassfish.jersey.message.internal.MessageBodyFactory.writeTo(MessageBodyFactory.java:1116)
...