Span | |||
---|---|---|---|
Wiki Markup | |||
|
| ||
} JAX-RS and JAX-WS {span} |
Table of Contents |
---|
JAX-RS and JAX-WS
Here's a beans.xml showing how to have a single service class supporting both SOAP and REST-based invocations at the same time with the help of JAX-WS and JAX-RS :
Code Block | ||||
---|---|---|---|---|
| ||||
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:jaxrs="http://cxf.apache.org/jaxrs"
xmlns:jaxws="http://cxf.apache.org/jaxws"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.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">
<import resource="classpath:META-INF/cxf/cxf.xml" />
<import resource="classpath:META-INF/cxf/cxf-extension-jaxrs-binding.xml" />
<import resource="classpath:META-INF/cxf/cxf-servlet.xml" />
<!-- JAX-RS -->
<jaxrs:server id="customerService" address="/">
<jaxrs:serviceBeans>
<ref bean="customerService" />
</jaxrs:serviceBeans>
</jaxrs:server>
<!-- JAX-WS -->
<jaxws:endpoint implementor="#customerService"
address="/CustomerWorld" wsdlLocation="..."/>
<bean id="customerService" class="demo.jaxrs.server.CustomerService" />
</beans>
|
...
When a WSDL-first approach is used then a document-literal-wrapped style may or may not be a good fit as the code generator unwraps all the types into a signature, for example :
Code Block | ||||
---|---|---|---|---|
| ||||
public class CustomerService {
public void doIt(String a, String b) {...};
}
|
By default JAX-RS may not be able to handle such methods as it requires that only a single parameter can be available in a signature that is not annotated by one of the JAX-RS annotations like @PathParam. So if
a 'String a' parameter can be mapped to a @Path template variable or one of the query segments then this signature won't need to be changed :
Code Block | ||||
---|---|---|---|---|
| ||||
@Path("/customers/{a}")
public class CustomerService {
public void doIt(@PathParam("a") String a, String b) {...};
}
|
...
When combining JAXWS and JAXRS, one may need to access some context information as part of processing a given request. At the moment, CXF JAXRS does not offer a context implementation which can be used to access a request-specific information common for both JAXWS and JAXRS requests, in cases when the same methods are used to handle both JAXWS and JAXRS requests. Please use a JAXWS WebServiceContext and JAXRS contexts or CXF JAXRS composite MessageContext :
Code Block | ||||
---|---|---|---|---|
| ||||
@Path("/customers") @WebService public class CustomerService { @Resource@Context WebServiceContext jaxwsContext; @Resource@Context MessageContext jaxrsContext; @WebMethod @POST public void doIt(String b) { isUserInRole(); }; private void isUserInRole() throws WebApplicationException { if (jaxwsContext.getSecurityContext() != null) { // soap invocation jaxwsContext.getSecurityContext().isUserInRole(theRole); } else { // http-only jaxrs one jaxrsContext.getSecurityContext().isUserInRole(theRole); } } } |
...
Using individual contexts like JAXRS SecurityContext might be less attractive :
Code Block | ||||
---|---|---|---|---|
| ||||
@WebService public class CustomerService { @Resource@Context WebServiceContext jaxwsContext; // @Resource can be applied too @Context SecurityContext jaxrsSecurityContext; } |
...
Note that if you do not share the same service methods between JAXRS and JAXWS invocations then you can directly access corresponding contexts :
Code Block | ||||
---|---|---|---|---|
| ||||
@Path("/customers") @WebService public class CustomerService @Resource@Context WebServiceContext jaxwsContext; @Resource@Context MessageContext jaxrsContext; @WebMethod public void doItSoap(String b) { isUserInRole(jaxwsContext.getSecurityContext().getPrincipal()); }; @POST public void doItSoap(String b) { isUserInRole(jaxwsContext.getSecurityContext().getPrincipal()); } private void isUserInRole(Principal p) throws WebApplicationException { ... } } |
...