You can find the full source code for this website in the Seam package in the directory /examples/wiki. It is licensed under the LGPL.
Prerequisites: seam and cxf are configured and running.
Now to add seam support to a cxf webservice in tomcat:
Add the org.jboss.seam.webservice.SOAPRequestHandler in the cxf-servlet.xml spring config file:
<jaxws:endpoint
id="myWS"
implementor="com.MyWSImpl"
wsdlLocation="classpath:MyWS.wsdl"
address="/myWS">
<jaxws:handlers>
<bean id="seamHandler" class="org.jboss.seam.webservice.SOAPRequestHandler"/>
</jaxws:handlers>
</jaxws:endpoint>
Then follow the strategy suggested in the seam documentation and build a conversation facade:
@Name(value = "conversationFacade")
@Scope(value = ScopeType.CONVERSATION)
@AutoCreate
public class ConversationFacade
{
@In
EntityManager entityManager;
@Begin(join = true)
public void invoke()
{
//
}
@SuppressWarnings({"unchecked"})
@Transactional
public <T> List<T> getResultList(String query, Object... params)
{
Query query1 = entityManager.createQuery(query);
for (int i = 0; i < params.length; i++)
{
Object param = params[i];
query1.setParameter(i + 1, param);
}
return query1.getResultList();
}
....
}
and reference it in your webservice implementation like this:
private ConversationFacade getConversationFacade()
{
ConversationFacade conversationFacade = (ConversationFacade) Component.getInstance(ConversationFacade.class, true);
conversationFacade.invoke();
return conversationFacade;
}
Be sure to put all your business logic inside the ConversationFacade:
public doSomethingMsgReply doSomething(@WebParam(partName = "doSomethingMsg", name = "doSomethingMsg", targetNamespace = "http://www.myCompany.com/myWS") doSomethingMsg doSomethingMsg) throws MyFault
{
doSomethingMsgReply doSomethingMsgReply = getConversationFacade().doSomethingMsgReply(doSomethingMsg);
return doSomethingMsgReply;
}
with doSomethingMsgReply(doSomethingMsg) something like this:
@Transactional
public doSomethingMsgReply(doSomethingMsg)
{
....
}