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) { .... }