我一直在尝试调整本文中提供的代码:http://blog.bdoughan.com/2012/02/xmlanyelement-and-xmladapter.html

当我作为一个独立的Java程序运行时(像这样 - https://github.com/bdoughan/blog20120213/blob/master/src/main/java/blog/anyelement/adapted/Demo.java),一切运行良好 .

我已将完整的源代码和项目放到Bitbucket上:https://bitbucket.org/johnson_shawn/stackoverflow-21471310

这是一个带有动态Web方面的最小Java项目 - 没有为Web-Inf / lib添加类,所有内容都由JBoss AS 7.1运行时“提供” .

我真的更专注于编组,所以我稍微调整了程序以输出一个工作正常的简单模型...但是,当我在JAX-RS服务中包装相同的代码时,我得到一个丑陋的错误,我可以不太理解 .

这是服务的主要方法:

import java.util.ArrayList;
import java.util.List;

import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.xml.bind.JAXBContext;
import javax.xml.bind.Marshaller;

@Path("/api/v2")
public class TestService  {


    @GET
    @Path("test")
    @Produces(value = { "application/json", "application/xml" })
    public TestModel getModel() {
            TestModel docket = getSampleModel();
            return docket;

    }


    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(TestModel.class, LabelValue.class);
        LabelValueAdapter adapter = new LabelValueAdapter(jc);

        TestModel docket = getSampleModel();

        Marshaller marshaller = jc.createMarshaller();
        marshaller.setAdapter(adapter);
        marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
        marshaller.marshal(docket, System.out);
    }


    private static TestModel getSampleModel() {
        TestModel model = new TestModel();
        List<LabelValue> metadata = new ArrayList<LabelValue>();
        metadata.add(new LabelValue("Distilled Water", "Deer Park"));
        metadata.add(new LabelValue("Mineral Water", "Mountain Stream"));
        metadata.add(new LabelValue("Purified Water", "Mr. Water"));
        model.setMetadata(metadata);
        return model;
    }

}

LabelValue类与Blaise Doughan的原始Parameter类基本相同 . 任何想法在RESTEasy级别可能出错导致此问题?

这是错误:

21:02:19,959 INFO [stdout] 2014-01-30 21:02:19,956 [http-localhost / 127.0.0.1:8080-1] WARN org.jboss.resteasy.core.SynchronousDispatcher(Log4jLogger.java:135) - 执行GET / api / v2 / test 21:02:19,959失败INFO [stdout] org.jboss.resteasy.plugins.providers.jaxb.JAXBMarshalException:javax.xml.bind.MarshalException 21:02:19,959 INFO [stdout] - 链接异常:21:02:19,959 INFO [stdout] [com.sun.istack.SAXException2 21:02:19,959 INFO [stdout] java.lang.NullPointerException] 21:02:19,959 INFO [stdout] at org.jboss . resteasy.plugins.providers.jaxb.AbstractJAXBProvider.writeTo(AbstractJAXBProvider.java:148)21:02:19,960 INFO [stdout] at org.jboss.resteasy.core.interception.MessageBodyWriterContextImpl.proceed(MessageBodyWriterContextImpl.java:117)21:21: 02:19,960 INFO [stdout] at org.jboss.resteasy.plugins.interceptors.encoding.GZIPEncodingInterceptor.write(GZIPEncodingInterceptor.java:104)21:02:19,960 INFO [stdout] at org.jboss.resteasy.core.interception . MessageBodyWriterContextImp l.proceed(MessageBodyWriterContextImpl.java:123)21:02:19,960 INFO [stdout] at org.jboss.resteasy.core.ServerResponse.writeTo(ServerResponse.java:250)21:02:19,960 INFO [stdout] at org . jboss.resteasy.core.SynchronousDispatcher.writeJaxrsResponse(SynchronousDispatcher.java:585)21:02:19,960 INFO [stdout] at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:506)21:02:19,960 INFO [stdout] at org.jboss.resteasy.core.SynchronousDispatcher.invokePropagateNotFound(SynchronousDispatcher.java:155)21:02:19,960 INFO [stdout] at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher . java:212)21:02:19,960 INFO [stdout] at com.custom.GuiceResteasyFilterDispatcher.doFilter(GuiceResteasyFilterDispatcher.java:118)21:02:19,961 INFO [stdout] at com.google.inject.servlet.FilterDefinition.doFilter( FilterDefinition.java:163)21:02:19,961 INFO [stdout] at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvo cation.java:58)21:02:19,961 INFO [stdout] at com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:168)21:02:19,961 com.google.inject的INFO [stdout] . servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:58)21:02:19,961 INFO [stdout] at com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:168)21:02:19,961 INFO [stdout] at at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:58)21:02:19,961 INFO [stdout] at com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:168)21:02: 19,961 INFO [stdout] at com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:58)21:02:19,961 INFO [stdout] at com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java: 118)21:02:19,962 INFO [stdout] at com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter.java:113)21:02:19,962 INFO [stdout] at org.apache.catalina.core.ApplicationFilterChain . INTERNA lDoFilter(ApplicationFilterChain.java:280)21:02:19,962 INFO [stdout] at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248)21:02:19,962 INFO [stdout] at org.apache . catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275)21:02:19,962 INFO [stdout] at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)21:02:19,962 INFO [stdout ] org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:165)21:02:19,962INFO [stdout] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155)21:02:19,962 INFO [stdout] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102 )21:02:19,962 INFO [stdout] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)21:02:19,962 INFO [stdout] at org.apache.catalina.connector.CoyoteAdapter.service (CoyoteAdapter.java:372)21:02:19,963 INFO [stdout] at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:877)21:02:19,963 INFO [stdout] at org.apache.coyote .http11.Http11Protocol $ Http11ConnectionHandler.process(Http11Protocol.java:679)21:02:19,963 INFO [stdout] at org.apache.tomcat.util.net.JIoEndpoint $ Worker.run(JIoEndpoint.java:931)21:02 :19,963 INFO [stdout] at java.lang.Thread.run(Thread.java:744)21:02:19,963 INFO [stdout]引起:javax.xml.bind.MarshalException 21:02:19,963 INFO [stdout] - 链接异常:21:02:19,963 INFO [stdout] [com.sun.istack.SAXException 2 21:02:19,963 INFO [stdout] java.lang.NullPointerException] 21:02:19,963 INFO [stdout] at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:326)21:21: 02:19,964 INFO [stdout] at com.sun.xml.bind.v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:251)21:02:19,964 INFO [stdout] at javax.xml.bind.helpers.AbstractMarshallerImpl . marshal(AbstractMarshallerImpl.java:74)21:02:19,964 INFO [stdout] at org.jboss.resteasy.plugins.providers.jaxb.AbstractJAXBProvider.writeTo(AbstractJAXBProvider.java:144)21:02:19,964 INFO [stdout] . .. 32更多21:02:19,964 INFO [stdout]引起:com.sun.istack.SAXException2 21:02:19,964 INFO [stdout] java.lang.NullPointerException 21:02:19,964 INFO [stdout] at com.sun .xml.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:247)21:02:19,964 INFO [stdout] at com.sun.xml.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:262 )21:02:19,964 INFO [stdout] at com.sun.xml.bind.v2.runtime.reflect.AdaptedLister $ ListIteratorImpl.next (AdaptedLister.java:115)21:02:19,964 INFO [stdout] at com.sun.xml.bind.v2.runtime.property.ArrayReferenceNodeProperty.serializeListBody(ArrayReferenceNodeProperty.java:107)21:02:19,965 INFO [stdout] at com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:159)21:02:19,965 INFO [stdout] at com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody (ClassBeanInfoImpl.java:358)21:02:19,965 INFO [stdout] at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsSoleContent(XMLSerializer.java:593)21:02:19,965 INFO [stdout] at com .sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:340)21:02:19,965 INFO [stdout] at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java) :494)21:02:19,965 INFO [stdout] at com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:323)21:02:19,965 INFO [stdout] ... 35更多21 :02:19,965 INFO [stdout]引起:java.lang.NullPointerException 21:02:19,965 INFO [stdout] at co m.sun.xml.bind.v2.runtime.reflect.AdaptedLister.getAdapter(AdaptedLister.java:68)21:02:19,965 INFO [stdout] at com.sun.xml.bind.v2.runtime.reflect.AdaptedLister . 访问$ 000(AdaptedLister.java:55)21:02:19,966 INFO [stdout] at com.sun.xml.bind.v2.runtime.reflect.AdaptedLister $ ListIteratorImpl.next(AdaptedLister.java:113)21:02:19,966 INFO [stdout] ... 42更多21:02:19,956 WARN [org.jboss.resteasy.core.SynchronousDispatcher]执行GET / api / v2 / test失败:org.jboss.resteasy.plugins.providers.jaxb.JAXBMarshalException: javax.xml.bind.MarshalException - 链接异常:[com.sun.istack.SAXException2 java.lang.NullPointerException] at org.jboss.resteasy.plugins.providers.jaxb.AbstractJAXBProvider.writeTo(AbstractJAXBProvider.java:148)[ resteasy-jaxb-provider-2.3.3.Final.jar:] org.jboss.resteasy.core.interception.MessageBodyWriterContextImpl.proceed(MessageBodyWriterContextImpl.java:117)[resteasy-jaxrs-2.3.3.Final.jar:]在org.jboss.resteasy.plugins.interceptors.encoding.GZIPEn codingInterceptor.write(GZIPEncodingInterceptor.java:104)[resteasy-jaxrs-2.3.3.Final.jar:] org.jboss.resteasy.core.interception.MessageBodyWriterContextImpl.proceed(MessageBodyWriterContextImpl.java:123)[resteasy-jaxrs- 2.3.3.Final.jar:] org.jboss.resteasy.core.ServerResponse.writeTo(ServerResponse.java:250)[resteasy-jaxrs-2.3.3.Final.jar:] org.jboss.resteasy.core .SynchronousDispatcher.writeJaxrsResponse(SynchronousDispatcher.java:585)[resteasy-jaxrs-2.3.3.Final.jar:] atorg.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:506)[resteasy-jaxrs-2.3.3.Final.jar:] at org.jboss.resteasy.core.SynchronousDispatcher.invokePropagateNotFound(SynchronousDispatcher.java:155 )[resteasy-jaxrs-2.3.3.Final.jar:] org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:212)[esteasy-jaxrs-2.3.3.Final.jar :] com.custom.GuiceResteasyFilterDispatcher.doFilter(GuiceResteasyFilterDispatcher.java:118)[classes:] at com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:163)[guice-servlet-3.0.jar:] com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:58)[guice-servlet-3.0.jar:]在com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:168)[guice] -comlet-3.0.jar:] com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:58)[guice-servlet-3.0.jar:] com.google.inject.servlet.FilterDefini在com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:58)[guice-servlet-3.0.jar:] at的.doFilter(FilterDefinition.java:168)[guice-servlet-3.0.jar:] com.google.inject.servlet.FilterDefinition.doFilter(FilterDefinition.java:168)[guice-servlet-3.0.jar:]在com.google.inject.servlet.FilterChainInvocation.doFilter(FilterChainInvocation.java:58)[guice- servlet-3.0.jar:] com.google.inject.servlet.ManagedFilterPipeline.dispatch(ManagedFilterPipeline.java:118)[guice-servlet-3.0.jar:]在com.google.inject.servlet.GuiceFilter.doFilter(GuiceFilter) .java:113)[guice-servlet-3.0.jar:] org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280)[jbossweb-7.0.17.Final.jar:] at org.apache .catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248)[jbossweb-7.0.17.Final.jar:] at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:275)[jbossweb-7.0 .17.Final.jar:]在org.apache .catalina.core.StandardContextValve.invoke(StandardContextValve.java:161)[jbossweb-7.0.17.Final.jar:] at org.jboss.as.web.security.SecurityContextAssociationValve.invoke(SecurityContextAssociationValve.java:165)[jboss -as-web-7.1.3.Final.jar:7.1.3.Final] at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155)[jbossweb-7.0.17.Final.jar:] at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)[jbossweb-7.0.17.Final.jar:] at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) [jbossweb-7.0.17.Final.jar:] org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:372)[jbossweb-7.0.17.Final.jar:] at org.apache.coyote . http:http://www.http11Processor.process(http11Processor.java:877)[jbossweb-7.0.17.Final.jar:] org.apache.coyote.http11.Http11Protocol $ Http11ConnectionHandler.process(Http11Protocol.java:679)[jbossweb-7.0 . 17.Final.jar:] at org.apache.tomcat.util.net.JIoEndpoint $ Worker.run(JIoEndpoint.j ava:931)[jbossweb-7.0.17.Final.jar:] java.lang.Thread.run(Thread.java:744)[rt.jar:1.7.0_45]引起:javax.xml.bind.MarshalException - 链接异常:[com.sun.istack.SAXException2 java.lang.NullPointerException],位于com.sun.xml.bind的com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:326) .v2.runtime.MarshallerImpl.marshal(MarshallerImpl.java:251)at javax.xml.bind.helpers.AbstractMarshallerImpl.marshal(AbstractMarshallerImpl.java:74)[jboss-jaxb-api_2.2_spec-1.0.4.Final.jar :1.0.4.Final] at org.jboss.resteasy.plugins.providers.jaxb.AbstractJAXBProvider.writeTo(AbstractJAXBProvider.java:144)[resteasy-jaxb-provider-2.3.3.Final.jar:] ... 32更多引起:com.sun.istack.SAXException2 java.lang.NullPointerException,位于com.sun.xml.bind.v2的com.sun.xml.bind.v2.runtime.XMLSerializer.reportError(XMLSerializer.java:247) . runtime.XMLSerializer.reportError(XMLSerializer.java:262)位于com.sun.xml.bind.v2.runtime.reflect.AdaptedLister $ ListIteratorImpl.next(已修改) Lister.java:115)com.sun.xml.bind.v2.runtime.property.ArrayReferenceNodeProperty.serializeListBody(ArrayReferenceNodeProperty.java:107)at com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody( Array.comProperty.java:159)com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:358)at com.sun.xml.bind.v2.runtime.XMLSerializer.childAsSoleContent(XMLSerializer.java: 593)atcom.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeRoot(ClassBeanInfoImpl.java:340)位于com.sun的com.sun.xml.bind.v2.runtime.XMLSerializer.childAsRoot(XMLSerializer.java:494) . xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:323)... 35更多引起:com.sun.xml.bind.v2.runtime.reflect.AdaptedLister.getAdapter上的java.lang.NullPointerException( AdaptedLister.java:68)at com.sun.xml.bind.v2.runtime.reflect.AdaptedLister.access $ 000(AdaptedLister.java:55)at com.sun.xml.bind.v2.runtime.reflect.AdaptedLister $ ListIteratorImpl .next(AdaptedLister.java:113)......还有42个