Page 3 of 3 FirstFirst 123
Results 21 to 26 of 26

Thread: How do I extract information from a soap header and pass it to the endpoint

  1. #21
    Join Date
    Apr 2009
    Posts
    14

    Default

    Just to add to my last post i thought of creating object manually for now and setting it in the request scope bean. I defined a request scoped bean which is being referred by interceptor and endpoint both. Then i created the Java object manually in interceptor and i set it into the request scoped bean. But i am still not able to access this object in the endpoint. I think there is some issue in my configurations.

    Code:
    	@Override
    	public boolean handleRequest(MessageContext messageContext, Object endpoint)
    			throws Exception {
    		System.out.println("Intercepted");
    		SoapHeader soapHeader = ((SaajSoapMessage) messageContext.getRequest()).getEnvelope().getHeader();
    		
    		SessionHeader sessionHeader = new SessionHeader(); 
    		for (Iterator iterator = soapHeader.examineAllHeaderElements(); iterator.hasNext();) {
    			SoapHeaderElement headerElement = (SoapHeaderElement) iterator.next();
    			if(headerElement.getName().getLocalPart().equals("session")){
    				System.out.println(headerElement.toString());
    				
    				DOMResult r = (DOMResult)headerElement.getResult();
    				Node sessionNode = r.getNode();
    				
    				NodeList childNodes = sessionNode.getChildNodes();
    				for (int j = 0; j < childNodes.getLength(); j++) {
    					Node childNode = childNodes.item(j);
    					if(childNode.getNodeType()== Node.ELEMENT_NODE && childNode.getLocalName().equals("sessionId")){
    						sessionHeader.setSessionId(childNode.getTextContent());
    					}
    				}
    			}
    		}
    		header.setSessionHeader(sessionHeader);
    		return true;
    
    	}
    Configuration
    Code:
    	<!-- Setting for Annotation endpoint -->
    	<bean id="addOperationEndpoint" class="com.conformity.webservice.endpoints.AddOperationEndPoint">
    		<property name="service" ref="conformityWebServiceMediator"/>
    		<property name="header" ref="sessionHeader"/>
    	</bean>
    	<bean id="sessionHeader" class="com.conformity.webservice.endpoints.SessionHeaderWrapper"
    		scope="request">
    	<!-- this next element effects the proxying of the surrounding bean -->
    		<aop:scoped-proxy />
    	</bean>
    	<bean id="soapHeaderInterceptor" class="com.conformity.webservice.interceptor.HeaderItemInterceptor">
    		<property name="unmarshaller" ref="marshaller" />
    		<property name="header" ref="sessionHeader"/>
    	</bean>
    Web.xml
    Code:
        <servlet-mapping>
            <servlet-name>spring-ws</servlet-name>
            <url-pattern>/conformity-ws/*</url-pattern>
        </servlet-mapping>	
    	<listener>
    		<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
    	</listener>
    	<filter>
    	<filter-name>requestContextFilter</filter-name>
    		<filter-class>org.springframework.web.filter.RequestContextFilter</filter-class>
    	</filter>
    	<filter-mapping>
    		<filter-name>requestContextFilter</filter-name>
    		<url-pattern>/conformity-ws/*</url-pattern>
    	</filter-mapping>
    Can anyone please tell me what is wrong here?

    Thanks,
    Muein

  2. #22
    Join Date
    Feb 2007
    Posts
    20

    Default

    For unmarshalling you define a marshaller in configuration
    Code:
    <!-- using Jibx -->
    	<bean id="integrazioneMarshaller"
    		class="org.springframework.oxm.jibx.JibxMarshaller">
    		<property name="targetClass">
    			<value>
    				it.almaviva.model.springws.integrazione.IntegrazioneImpl
    			</value>
    		</property>
    	</bean>
    
    <!-- using JAXB2 -->
    	<bean id="jaxbMarshaller"
    		class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
    		<property name="contextPath" value="it.almaviva.model.jaxb" />
    		<property name="mtomEnabled" value="true" />
    	</bean>
    and then call unmarshal on the SoapHeaderElement in your code:
    Code:
    ...
    import org.springframework.oxm.Unmarshaller;
    ...
    private Unmarshaller unmarshaller=null;
    ...
    SoapHeaderElement element=....
    YourHeaderType myHead = (YourHeaderType ) unmarshaller.unmarshal(element.getSource());
    for the request scoped bean configuration here is a sample
    Code:
    	<bean id="integrazione"
    		class="it.almaviva.model.springws.integrazione.IntegrazioneImpl"
    		scope="request">
    		<property name="tipoCorrelazione" value="coll" />
    		<aop:scoped-proxy proxy-target-class="false" />
    	</bean>
    ...
    	<bean id="getContattiByCittaAsynchSimmMarshallingEndpoint"
    		class="it.almaviva.springws.GetContattiByCittaAsynchSimmMarshallingEndpoint"
    		p:marshaller-ref="statorichiestaMarshaller"
    		p:unmarshaller-ref="nomecittaasyncUnMarshaller"
    		p:integra-ref="integrazione" p:jmsTemplate-ref="jmsTemplate" />
    ...
    	<bean
    		class="org.springframework.ws.server.endpoint.mapping.PayloadRootQNameEndpointMapping">
    		<property name="interceptors">
    			<list>
    				<ref bean="integrazioneInterceptor" />
    			</list>
    		</property>
    		<property name="endpointMap">
    			<map>
    				<entry
    					key="{http://luciano.mytest.com/schema/spcoop}nomecittaasyncparm"
    					value-ref="getContattiByCittaAsynchSimmMarshallingEndpoint" />
    				<entry
    	...
    			</map>
    		</property>
    	</bean>
    ...
    	<bean id="integrazioneInterceptor"
    		class="it.almaviva.springws.interceptors.IntegrationHeaderServerInterceptor"
    		p:integra-ref="integrazione" />
    Luciano

  3. #23
    Join Date
    Apr 2009
    Posts
    14

    Default

    Thanks for the reply. I have been able to unmarshall Soap header into Java object. But i am still not able to access the Soapheader in endpoint. I have looked at your configurations and i am still not sure what am i missing .

    Can you please also share the code of your it.almaviva.model.springws.integrazione.Integrazio neImpl class.

    Here is my configuration file for ur reference.

    Code:
    	<bean id="addOperationEndpoint" class="com.conformity.webservice.endpoints.AddOperationEndPoint">
    		<property name="service" ref="conformityWebServiceMediator"/>
    		<property name="header" ref="sessionHeaderWrapper"/>
    	</bean>
    	<bean id="sessionHeaderWrapper" class="com.conformity.webservice.endpoints.SessionHeaderWrapper"
    		scope="request">
    	<!-- this next element effects the proxying of the surrounding bean -->
    		<aop:scoped-proxy />
    	</bean>
    	<bean id="soapHeaderInterceptor" class="com.conformity.webservice.interceptor.HeaderItemInterceptor">
    		<property name="unmarshaller" ref="marshaller" />
    		<property name="header" ref="sessionHeaderWrapper"/>
    	</bean>
    SessionHeaderWrapper
    ---------------------
    Code:
    public class SessionHeaderWrapper {
    	SessionHeader sessionHeader;
    	public SessionHeader getSessionHeader() {
    		return sessionHeader;
    	}
    	public void setSessionHeader(SessionHeader sessionHeader) {
    		this.sessionHeader = sessionHeader;
    	}
    }
    Interceptor
    -----------
    Code:
    	@Override
    	public boolean handleRequest(MessageContext messageContext, Object endpoint)
    			throws Exception {
    		System.out.println("Intercepted");
    		SoapHeader soapHeader = ((SaajSoapMessage) messageContext.getRequest()).getEnvelope().getHeader();
    		
    //		SessionHeader sessionHeader = new SessionHeader(); 
    		SessionHeader sessionHeader = null; 
    		for (Iterator iterator = soapHeader.examineAllHeaderElements(); iterator.hasNext();) {
    			SoapHeaderElement headerElement = (SoapHeaderElement) iterator.next();
    			if(headerElement.getName().getLocalPart().equals("sessionHeader")){
    				System.out.println(headerElement.toString());
    				JAXBElement<SessionHeader> sessionHeaderJaxb = (JAXBElement<SessionHeader>) unmarshaller.unmarshal(headerElement.getSource());
    				sessionHeader = sessionHeaderJaxb.getValue();
    
    		header.setSessionHeader(sessionHeader);
    		return true;
    
    	}
    I really appreciate ur help.

    Thanks,
    Muein

  4. #24
    Join Date
    Apr 2009
    Posts
    14

    Default

    Alright, it is working now. Actually it was working earlier as well the problem was that i wasn't using the scoped bean within my end point. i was just looking at the bean using debugger which is showing a null value.

    Once i got this bean within my endpoint it started showing header values.

    Thanks for you help.
    Muein

  5. #25
    Join Date
    Jul 2010
    Posts
    1

    Default

    Hi All,

    Good day Spring people!

    I'm currently implenting Spring web services and I kind of stuck in this same situation as well. It is good thing to know I can use a request scope bean for this scenario but I noticed that this has been a year ago. I wonder if the new release of Spring web service already implemented a different approach to handle this?

    Thank you!

  6. #26
    Join Date
    Nov 2011
    Posts
    22

    Default

    Hi All,

    I am trying to extract the header information before passing to endpoint.. Can someone please provide me with good example for it..

    Thanks in advance

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •