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.