我想用Spring Integration发送一条肥皂消息。我使用Java Config。 我已尝试过flolowing拦截器,但spring集成将尖括号(<>)转换为html转义字符。
import org.springframework.ws.client.WebServiceClientException;
import org.springframework.ws.client.support.interceptor.ClientInterceptor;
import org.springframework.ws.context.MessageContext;
import org.springframework.ws.soap.SoapHeader;
import org.springframework.ws.soap.SoapHeaderElement;
import org.springframework.ws.soap.SoapMessage;
public class MyAuthInterceptor implements ClientInterceptor {
@Override
public boolean handleRequest(MessageContext messageContext) throws WebServiceClientException {
SoapMessage soapMessage = (SoapMessage) messageContext.getRequest();
SoapHeader sh = soapMessage.getSoapHeader();
QName name = new QName("http://...", "myAuth", "aut");
sh.addHeaderElement(name).setText("<username>TestUser</username>" + "<password>TestPass</password>");
return true;
}
这是生成的soap标题:
<SOAP-ENV:Header>
<aut:myAuth xmlns:aut="http://.../"><username>TestUser</username><password>TestPass</password></aut:myAuth>
</SOAP-ENV:Header>
这是我的配置:
@Configuration
@EnableIntegration
public class SpringIntegrationConfiguration {
@Bean
public PublishSubscribeChannel inputChannel() {
return new PublishSubscribeChannel();
}
@Bean
public ClientInterceptor myAuthInterceptor() {
return new MyAuthInterceptor();
}
@Bean
@ServiceActivator(inputChannel = "inputChannel")
public SimpleWebServiceOutboundGateway myOutput(ClientInterceptor mekAuthInterceptor) {
SimpleWebServiceOutboundGateway simpleWebServiceOutboundGateway = new SimpleWebServiceOutboundGateway("http://...");
simpleWebServiceOutboundGateway.setInterceptors(myAuthInterceptor);
return simpleWebServiceOutboundGateway;
}
}
如何在不转义尖括号的情况下设置soap标头?
答案 0 :(得分:1)
您必须使用addChildElement
进行构建,而不是将其设置为文本。
答案 1 :(得分:0)
您正在将标记设置为文本,因为它被添加到xml中,因此会转义字符串。那些需要设置为元素
http://docs.oracle.com/javaee/5/api/javax/xml/soap/SOAPHeaderElement.html
检查上述文档中的方法并正确使用它。如果您需要更多帮助,请发表评论。
答案 2 :(得分:0)
@ gary-russell-从逻辑的角度来看,您的回答是合理的,但是org.springframework.ws.soap。中没有“ addChildElement”方法。我在javax.xml.soap中找到了它们。。
所以我的结果如下:
package main
import (
"context"
"fmt"
"reflect"
)
type Fn func(context.Context)
type testStruct struct{}
func (*testStruct) DoSomething(context.Context) {}
func (*testStruct) DoSomethingElse([]byte) {}
func main() {
structType := reflect.TypeOf(&testStruct{})
rctx := reflect.TypeOf(new(context.Context)).Elem()
for i := 0; i < structType.NumMethod(); i++ {
fmt.Println("======================")
method := structType.Method(i)
fmt.Println(method.Name)
fmt.Println(method.Type.String())
if method.Type.NumIn() != 2 {
fmt.Println("wrong number of inputs, expected 1")
continue
}
if method.Type.In(1) != rctx {
fmt.Println("input of wrong type, expected context.Context")
continue
}
if method.Type.NumOut() != 0 {
fmt.Println("wrong number of outputs, expected 0")
continue
}
fmt.Printf("%v is a function of correct type\n", method.Name)
}
}