Is there a JBossWS client example for invoking a Seam ws?
lowecg2004 Jul 30, 2007 6:05 AMI've successfully setup a Seam web service, generated the proxies using wsconsume and installed the Seam conversation SOAP handler.
I'm having real difficulty finding out how to add/read the conversationId SOAP header. Without it I just get this exception:
Caused by: java.lang.NullPointerException at org.jboss.seam.webservice.SOAPRequestHandler.extractConversationId(SOAPRequestHandler.java:137) at org.jboss.seam.webservice.SOAPRequestHandler.handleInbound(SOAPRequestHandler.java:75) at org.jboss.seam.webservice.SOAPRequestHandler.handleMessage(SOAPRequestHandler.java:56) at org.jboss.ws.core.jaxws.handler.HandlerChainExecutor.handleMessage(HandlerChainExecutor.java:295) at org.jboss.ws.core.jaxws.handler.HandlerChainExecutor.handleMessage(HandlerChainExecutor.java:140) ... 27 more
Could anyone point me to the right documentation/example/anything that might help?
Shouldn't the lack of conversationId header just be ignored since that implies all my Seam web services must be conversational? I may wish to have a mix of web services where some may be stateless or just work at the session context?
I tried implementing a web service without the SOAP handler (because of the aforementioned NPE) using a similar example to a simple stateful web service example suggested by Rama Pulavarthi:
http://weblogs.java.net/blog/ramapulavarthi/archive/2006/06/maintaining_ses.html
The web service is invoked just fine, however anything I save to HttpSession using setAttribute() does not survive beyond the request. So, on a subsequent request to a servlet using the JSESSIONID obtained from the WS call, the corresponding getAttribute call returns null.
I tried to have a go at debugging this and thought that SessionContext.flush() might be a good place to start digging around (my web service also placed some values into SessionContext) but this was never called. I suppose that makes sense given that I commented out the handler responsible for managing contexts ;) However, could the lack of SOAP handler also cause the values I saved to a regular HttpSession to not be saved?
Cheers,
Chris
Here is my WS code:
@Name("developmentService") @Stateless @WebService(name = "DevelopmentService", serviceName = "DevelopmentService" ) public class DevelopmentAuthenticator implements DevelopmentServiceRemote { @Logger Log log; @Resource private WebServiceContext wsContext; @WebMethod public boolean login(final String username, final String password) { final MessageContext mc = wsContext.getMessageContext(); // This would be called during an AppletViewer session before any server calls. Therefore, // create a HttpSession so the HTTP response has a JSESSIONID cookie which can be used // by all other server requests. final HttpSession session = ((HttpServletRequest)mc.get(MessageContext.SERVLET_REQUEST)).getSession(); if (session == null) { throw new WebServiceException("No session in WebServiceContext"); } // do authentication Identity.instance().setUsername(username); Identity.instance().setPassword(password); Identity.instance().login(); final boolean isLoggedIn = Identity.instance().isLoggedIn(); if (isLoggedIn) { // Authenticator stores the userId on the SessionContext final Integer userId = (Integer) Contexts.getSessionContext().get("userId"); // verify that userId is set if (userId == null) { log.warn("User ID not set after successful login in web service call."); } // transfer the user id to the HttpSession to allow access from all JEE entities, // not just Seam components. session.setAttribute("userId", userId); log.info("adding userId: {0} to session {1}", session.getAttribute("userId"), session.getId()); } return isLoggedIn; } }