简体   繁体   中英

Alternate to @XmlRootElement?

in process of exposing existing statefull service as a RESTfull service.

I do not want to make any changes to any existing java class.I have been able to configure other annotations such as @path, @GET using spring-config.xml

spring-config.xml

<!-- Inquiry Services -->
    <bean id="retrieveContactHistoryBP" class="com.csc.fs.ws.contact.history.impl.RetrieveContactHistoryBPService"/>        
    <!-- Update Services -->
    <bean id="startContactBP" class="com.csc.fs.ws.contact.impl.StartContactBPService"/>

    <!-- REST services -->
    <bean id="startContactBPRest" class="com.csc.fs.rest.contact.StartContactBP" scope="prototype" />
    <bean id="retrieveContactHistoryBPRest" class="com.csc.fs.rest.contact.RetrieveContactHistoryBP" scope="prototype" />

    <!-- Exposing beans as rest services -->
    <jaxrs:server id="restServer" address="/rest/">
        <jaxrs:model id="restModel">
            <jaxrs:resource name="com.csc.fs.rest.contact.RetrieveContactHistoryBP" path="retrieveContactHistoryBP">
                <jaxrs:operation name="retrieve" path="{partyId}" consumes="application/json" produces="application/json" verb="GET">
                    <jaxrs:param name="req" type="CONTEXT"/>
                    <jaxrs:param name="partyId" type="PATH"/>
                </jaxrs:operation>
            </jaxrs:resource>
            <jaxrs:resource name="com.csc.fs.rest.contact.StartContactBP" path="startContactBP">
                <jaxrs:operation name="startContact" path="/" consumes="application/json" produces="application/json" verb="PUT">
                    <jaxrs:param name="req" type="CONTEXT"/>
                    <jaxrs:param name="startContact" type="REQUEST_BODY"/>
                </jaxrs:operation>
            </jaxrs:resource>
        </jaxrs:model>
        <jaxrs:serviceBeans>
<!--             <ref bean="startContactBPRest"/> --> <!-- Instead configure above -->
<!--             <ref bean="retrieveContactHistoryBPRest"/> -->
        </jaxrs:serviceBeans>
        <jaxrs:extensionMappings>
            <entry key="feed" value="application/atom+xml"/>
            <entry key="json" value="application/json"/>
            <entry key="xml" value="application/xml"/>
            <entry key="html" value="text/html"/>
        </jaxrs:extensionMappings>

        <jaxrs:providers>
            <ref bean="jaxbProvider"/>
            <ref bean="jsonProvider" />
        </jaxrs:providers>
    </jaxrs:server>

The thing I am facing problem is with the @XmlRootElement . I have not been successful in configuring it through the xml.

And I get the following error when trying to access the REST service

org.apache.cxf.interceptor.Fault
    org.apache.cxf.interceptor.AbstractFaultChainInitiatorObserver.onMessage(AbstractFaultChainInitiatorObserver.java:67)
    org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:315)
    org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:113)
    org.apache.cxf.transport.servlet.ServletDestination.invoke(ServletDestination.java:105)
    org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:461)
    org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:188)
    org.apache.cxf.transport.servlet.AbstractCXFServlet.invoke(AbstractCXFServlet.java:148)
    org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:179)
    org.apache.cxf.transport.servlet.AbstractHTTPServlet.doGet(AbstractHTTPServlet.java:108)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:159)


root cause 

java.lang.NullPointerException
    org.apache.cxf.jaxrs.model.wadl.WadlGenerator.handleOperation(WadlGenerator.java:310)
    org.apache.cxf.jaxrs.model.wadl.WadlGenerator.handleResource(WadlGenerator.java:253)
    org.apache.cxf.jaxrs.model.wadl.WadlGenerator.handleRequest(WadlGenerator.java:185)
    org.apache.cxf.jaxrs.impl.RequestPreprocessor.checkMetadataRequest(RequestPreprocessor.java:189)
    org.apache.cxf.jaxrs.impl.RequestPreprocessor.preprocess(RequestPreprocessor.java:82)
    org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.processRequest(JAXRSInInterceptor.java:112)
    org.apache.cxf.jaxrs.interceptor.JAXRSInInterceptor.handleMessage(JAXRSInInterceptor.java:88)
    org.apache.cxf.phase.PhaseInterceptorChain.doIntercept(PhaseInterceptorChain.java:255)
    org.apache.cxf.transport.ChainInitiationObserver.onMessage(ChainInitiationObserver.java:113)
    org.apache.cxf.transport.servlet.ServletDestination.invoke(ServletDestination.java:105)
    org.apache.cxf.transport.servlet.ServletController.invokeDestination(ServletController.java:461)
    org.apache.cxf.transport.servlet.ServletController.invoke(ServletController.java:188)
    org.apache.cxf.transport.servlet.AbstractCXFServlet.invoke(AbstractCXFServlet.java:148)
    org.apache.cxf.transport.servlet.AbstractHTTPServlet.handleRequest(AbstractHTTPServlet.java:179)
    org.apache.cxf.transport.servlet.AbstractHTTPServlet.doGet(AbstractHTTPServlet.java:108)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    org.apache.cxf.transport.servlet.AbstractHTTPServlet.service(AbstractHTTPServlet.java:159)

So, Is there a way to configure the information in the XmlRoot annotation externally, so we don't have to add it to Java code?

From the Apache-cxf documentation on jaxrs-data-bindings :

Alternatively to using @XmlRootElement and Collection wrappers, one can provide an Object factory which will tell JAXB how to marshal a given type (in case of Collections - its template type). Another option is to return/accept a JAXBElement directly from/in a given method.

Another option is to register one or more JAX-RS ContextResolver providers capable of creating JAXBContexts for a number of different types. The default JAXBElementProvider will check these resolvers first before attempting to create a JAXBContext on its own.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM