diff --git a/soap/src/main/java/feign/soap/SOAPEncoder.java b/soap/src/main/java/feign/soap/SOAPEncoder.java index d4b0873c4..8a72bd997 100644 --- a/soap/src/main/java/feign/soap/SOAPEncoder.java +++ b/soap/src/main/java/feign/soap/SOAPEncoder.java @@ -93,7 +93,7 @@ public class SOAPEncoder implements Encoder { private final JAXBContextFactory jaxbContextFactory; private final String soapProtocol; - private SOAPEncoder(Builder builder) { + public SOAPEncoder(Builder builder) { this.jaxbContextFactory = builder.jaxbContextFactory; this.writeXmlDeclaration = builder.writeXmlDeclaration; this.charsetEncoding = builder.charsetEncoding; diff --git a/soap/src/test/java/feign/soap/SOAPCodecTest.java b/soap/src/test/java/feign/soap/SOAPCodecTest.java index 9ba480f44..d9c14c239 100644 --- a/soap/src/test/java/feign/soap/SOAPCodecTest.java +++ b/soap/src/test/java/feign/soap/SOAPCodecTest.java @@ -22,11 +22,17 @@ import java.util.Collection; import java.util.Collections; import java.util.Map; +import javax.xml.bind.JAXBException; +import javax.xml.bind.Marshaller; import javax.xml.bind.annotation.XmlAccessType; import javax.xml.bind.annotation.XmlAccessorType; import javax.xml.bind.annotation.XmlElement; import javax.xml.bind.annotation.XmlRootElement; import javax.xml.bind.annotation.XmlValue; +import javax.xml.soap.SOAPElement; +import javax.xml.soap.SOAPException; +import javax.xml.soap.SOAPFactory; +import javax.xml.soap.SOAPMessage; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; @@ -383,6 +389,62 @@ public void notFoundDecodesToNull() throws Exception { .decode(response, byte[].class)).isEmpty(); } + @Test + public void changeSoapProtocolAndSetHeader() { + Encoder encoder = + new ChangedProtocolAndHeaderSOAPEncoder(new JAXBContextFactory.Builder().build()); + + GetPrice mock = new GetPrice(); + mock.item = new Item(); + mock.item.value = "Apples"; + + RequestTemplate template = new RequestTemplate(); + encoder.encode(mock, GetPrice.class, template); + + String soapEnvelop = "" + + "" + + "" + + (System.getProperty("java.version").startsWith("1.8") + ? "" + : "") + + + "" + + "test" + + "test" + + "" + + "" + + "" + + "" + + "" + + "Apples" + + "" + + "" + + ""; + assertThat(template).hasBody(soapEnvelop); + } + + static class ChangedProtocolAndHeaderSOAPEncoder extends SOAPEncoder { + + public ChangedProtocolAndHeaderSOAPEncoder(JAXBContextFactory jaxbContextFactory) { + super(new SOAPEncoder.Builder() + .withSOAPProtocol("SOAP 1.2 Protocol") + .withJAXBContextFactory(jaxbContextFactory)); + } + + @Override + protected SOAPMessage modifySOAPMessage(SOAPMessage soapMessage) throws SOAPException { + SOAPFactory soapFactory = SOAPFactory.newInstance(); + String uri = "http://schemas.xmlsoap.org/ws/2002/12/secext"; + String prefix = "wss"; + SOAPElement security = soapFactory.createElement("Security", prefix, uri); + SOAPElement usernameToken = soapFactory.createElement("UsernameToken", prefix, uri); + usernameToken.addChildElement("Username", prefix, uri).setValue("test"); + usernameToken.addChildElement("Password", prefix, uri).setValue("test"); + security.addChildElement(usernameToken); + soapMessage.getSOAPHeader().addChildElement(security); + return soapMessage; + } + } @XmlRootElement(name = "GetPrice") @XmlAccessorType(XmlAccessType.FIELD)