JAX-RS can't unmarshall request body if the corresponding parameter is 
annotated with non-JAX-RS annotation
-----------------------------------------------------------------------------------------------------------

                 Key: CXF-1882
                 URL: https://issues.apache.org/jira/browse/CXF-1882
             Project: CXF
          Issue Type: Bug
          Components: JAX-WS Runtime, JAXB Databinding, REST
    Affects Versions: 2.1.2
         Environment: windows XP
apache-tomcat-6.0.13
jdk1.6.0_02
            Reporter: Gabo Manuel


I have a java-first service. The goal is to have a single service 
implementation that can be accessed via SOAP or as ReST service. I am using the 
JAX-WS annotations to have a more descriptive WSDL. I am using the JAX-RS 
annotations as defined in: http://cwiki.apache.org/CXF20DOC/jax-rs-jsr-311.html 
. Below is a trimmed down version of the code:

//AccountService.java
import javax.jws.WebMethod;
import javax.jws.WebParam;
import javax.jws.WebService;
import javax.ws.rs.ConsumeMime;
import javax.ws.rs.PUT;
import javax.ws.rs.Path;

@WebService(serviceName="AccountService")
@ConsumeMime("text/xml") 
public class AccountService {
        @PUT
        @Path("/Account")
        @WebMethod
        public long insert(
                        @WebParam(name="account")
                        Account account
                        ) {
                logger.info("insert Received: " + account);
                return 0;
        }
}

//Account.java
import javax.ws.rs.Path;
import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;

@XmlRootElement(name="Account")
@XmlType(name="Account")
@XmlAccessorType(XmlAccessType.PROPERTY)
public class Account {
        private String accountID = "";
        public String getAccountID() {
                return accountID;
        }

        public void setAccountID(String accountID) {
                this.accountID = accountID;
        }
}
        
//beans.xml
<beans xmlns="http://www.springframework.org/schema/beans";
      xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance";
      xmlns:jaxws="http://cxf.apache.org/jaxws";
      xmlns:soap="http://cxf.apache.org/bindings/soap";
          xmlns:sec="http://cxf.apache.org/configuration/security";
          xmlns:jaxrs="http://cxf.apache.org/jaxrs";
      xsi:schemaLocation="
                http://www.springframework.org/schema/beans 
            http://www.springframework.org/schema/beans/spring-beans-2.0.xsd 
            http://cxf.apache.org/bindings/soap 
            http://cxf.apache.org/schemas/configuration/soap.xsd
            http://cxf.apache.org/core
            http://cxf.apache.org/schemas/core.xsd
                http://cxf.apache.org/jaxrs
                http://cxf.apache.org/schemas/jaxrs.xsd
            http://cxf.apache.org/jaxws 
            http://cxf.apache.org/schemas/jaxws.xsd 
            http://cxf.apache.org/configuration/security 
            http://cxf.apache.org/schemas/configuration/security.xsd
            http://cxf.apache.org/transports/http/configuration
            http://cxf.apache.org/schemas/configuration/http-conf.xsd
            http://cxf.apache.org/transports/http-jetty/configuration
            http://cxf.apache.org/schemas/configuration/http-jetty.xsd
    ">
        <import resource="classpath:META-INF/cxf/cxf.xml" />
        <import resource="classpath:META-INF/cxf/cxf-extension-soap.xml" />
        <import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
    <import resource="classpath:META-INF/cxf/cxf-extension-jaxrs-binding.xml" />
    <import resource="classpath:META-INF/cxf/cxf-extension-http-binding.xml"/>
        <import resource="classpath:META-INF/cxf/cxf-extension-xml.xml"/>
        
        <jaxrs:server id="accountRestService" address="/rest/Accounts">
                <jaxrs:serviceBeans>
                        <ref bean="accountServiceClass" />
                </jaxrs:serviceBeans>
        </jaxrs:server>

        <bean id="accountServiceClass" class="AccountService" />

    <jaxws:endpoint 
        id="accountSoapService" 
        address="/soap/Accounts"
        implementor="#accountServiceClass"
        >
    </jaxws:endpoint>
</beans>

I have already discussed this with Sergey of CXF support team 
(http://www.nabble.com/-JAX-WS--JAX-RS--tt20007600.html). The issue seem to be 
not present if the parameter is not annotated by JAX-WS. Below is a snippet of 
his findings:

<quote>
I think I might know what might be happening - JAXRS runtime does not recognize 
the Account as being a standalone method parameter as it's annotated with a 
JAXWS annotation. On other words, in JAX-RS, providers(by default) are used 
only when unmarshalling parameters not annotated with JAX-RS annotations, for ex

void foo(@PathParam("id") String id, Account acc);

here the Account will be unmarshalled as expected but because you have

void foo(@WebParam(name="account") Account account);

the runtime mistakenly ignores it.... 
</quote>

Please advise if you need more information.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.

Reply via email to