You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@cxf.apache.org by "Benson Margulies (JIRA)" <ji...@apache.org> on 2007/12/15 03:23:43 UTC

[jira] Resolved: (CXF-1294) Problem creating several custom Headers

     [ https://issues.apache.org/jira/browse/CXF-1294?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Benson Margulies resolved CXF-1294.
-----------------------------------

       Resolution: Fixed
    Fix Version/s: 2.1
         Assignee: Daniel Kulp  (was: Benson Margulies)

Dan might port this to 2.0.4.

> Problem creating several custom Headers
> ---------------------------------------
>
>                 Key: CXF-1294
>                 URL: https://issues.apache.org/jira/browse/CXF-1294
>             Project: CXF
>          Issue Type: Bug
>    Affects Versions: 2.0.3
>         Environment: Windows XP SP2, Eclipse 3.3, JAVA 1.6.03
>            Reporter: Tim
>            Assignee: Daniel Kulp
>             Fix For: 2.1
>
>
>   Hi all,
> we generated a Java WS Client from given wsdl-files, which should generate a SOAP Request with several Header entries.
> At runtime one of two headers was dropped in the request.
> Excerpt from generated Code:
> <code>
> public interface TelematikSignedPortType {
>     @RequestWrapper(localName = "TelematikExecute", targetNamespace = "http://ws.gematik.de/tel/transport/v1.2", className = "de.gematik.ws.tel.transport.v1.TelematikExecuteType")
>     @ResponseWrapper(localName = "TelematikExecuteResponse", targetNamespace = "http://ws.gematik.de/tel/transport/v1.2", className = "de.gematik.ws.tel.transport.v1.TelematikExecuteType")
>     @WebMethod(operationName = "TelematikExecute", action = "http://ws.gematik.de/tel/transportWSDL/v1.4#telematikexecute")
>     public void telematikExecute(
>         @WebParam(targetNamespace = "http://ws.gematik.de/tel/transport/v1.2", name = "Payload", mode = Mode.INOUT)
>         javax.xml.ws.Holder<de.gematik.ws.tel.transport.v1.TelematikExecuteType.Payload> payload,
>         @WebParam(targetNamespace = "http://ws.gematik.de/tel/transport/v1.2", name = "TransportHeader", header = true, mode = Mode.INOUT)
>         javax.xml.ws.Holder<de.gematik.ws.tel.transport.v1.TransportHeader> transportHeader,
>         @WebParam(targetNamespace = "http://ws.gematik.de/tel/transport/v1.2", name = "TelematikHeader", header = true, mode = Mode.INOUT)
>         javax.xml.ws.Holder<de.gematik.ws.tel.transport.v1.TelematikHeader> telematikHeader
>     ) throws FaultMessage;
> }
> </code>
> This issue seems to be related to filling the AbstractMessageContainer with MessageParts. This is done several times in the case of headers, overwriting  existing indices with the container's current size. As a result the WrapperMsgInfo in WrapperClassOutInterceptor.java gets corrupted index values, so that the first header is overwritten by the second one and so on.
> <code>
> 		for (MessagePartInfo p : messageInfo.getMessageParts()) {
> 					if (Boolean.TRUE.equals(p
> 							.getProperty(ReflectionServiceFactoryBean.HEADER))) {
> 						MessagePartInfo mpi = wrappedMsgInfo.getMessagePart(p
> 								.getName());
>                                                 // MPI HAS CORRUPTED INDEX!
> 						if (objs.hasValue(p)) {
> 							newObjs.put(mpi, objs.get(p));
> 						}
> 					}
> 				}
> </code>
> Suggested Hotfix AbstractMessageContainer.jaa
> <code>
> 	public void addMessagePart(MessagePartInfo part) {
>                 // KEEP EXISTING INDEX IF ANY
> 		if (messageParts.containsKey(part.getName())) {
> 			part.setIndex(messageParts.get(part.getName()).getIndex());
> 		} else {
> 			part.setIndex(messageParts.size());
> 		}
> 		messageParts.put(part.getName(), part);
> 	}
> </code>
> Thx for looking into this, keep up the good work.
> cheers,
> Timmeh and Simon.

-- 
This message is automatically generated by JIRA.
-
You can reply to this email to add a comment to the issue online.