1.使用框架:CXF
2.使用语言:JAVA客户端调用服务端程序,传递参数是XML格式的字符串<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<reqInfo>
<recordInfo>
<channelType>05</channelType>
<createTime>20160630083759</createTime>
<detail>测试提一个建议</detail>
<operator>8103</operator>
<recordSendId>JT410100201606306418</recordSendId>
<serviceType>02</serviceType>
<sourceArea>410100</sourceArea>
<startDate>0</startDate>
</recordInfo>
</reqInfo>日志打印出的SOAP报文:发现:XML中的<符合被转义成<之后添加一个拦截器:日志打印出的SOAP报文:发现XML格式正常了,但是SOAP报文格式乱了。请大神指点!!
2.使用语言:JAVA客户端调用服务端程序,传递参数是XML格式的字符串<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<reqInfo>
<recordInfo>
<channelType>05</channelType>
<createTime>20160630083759</createTime>
<detail>测试提一个建议</detail>
<operator>8103</operator>
<recordSendId>JT410100201606306418</recordSendId>
<serviceType>02</serviceType>
<sourceArea>410100</sourceArea>
<startDate>0</startDate>
</recordInfo>
</reqInfo>日志打印出的SOAP报文:发现:XML中的<符合被转义成<之后添加一个拦截器:日志打印出的SOAP报文:发现XML格式正常了,但是SOAP报文格式乱了。请大神指点!!
解决方案 »
- [求达人]关于java、Swing如何调用一个已知的com组件jacob、jni
- 客户信息管理通用性如何设计?
- 广州IT工资水平是不是很低???
- EJB组件的调用
- 请问哪有同时把myeclipse+struts+hibernate+spring结合的很简单的实例教程啊?(比如登录的小程序或有基本的添加数据的小程序等)谢谢
- DES解密问题,请兄弟朋友救命!(高分)
- tomcat-jsp:问题(急)!!!
- 初学struts问题:Servlet action is not available
- struts的小问题
- 在什么情况下可以显示出连接池的高效率,说得越详细分越多
- repaint()方法在线程中调用不起作用
- 求教!Hibernate如何捕获SQLException中SQLState状态码?
这样不行,会直接报错,解析格式错误之类的
有什么办法可以直接拼接成下面的格式
这里是不是少了“>”
webservice 接口对象中,应该有一个字符串字段,用于传递你的xml字符串服务器或客户端cxf框架,自动将字符串处理后打如soap报文,另外一端也会自动解码。你要按面向对象的方式处理接口(框架已经将soap到对象转换的工作实现了),就是直接使用接口对象,而不要用解析报文的方式处理
这里是不是少了“>”
这个是手误,我的意思是通过这样的字符串拼接时候<![CDATA[里面的<也被转义了,而且里面的标签<也是被转义了,没有什么用
这里是不是少了“>”
这个是手误,我的意思是通过这样的字符串拼接时候<![CDATA[里面的<也被转义了,而且里面的标签<也是被转义了,没有什么用
就我的理解,webservice传递xml是完全没有问题的,不需要加CDATA什么的。
可能存在某个配置项,控制是否将特殊字符转移,也可能只是你看到是转义的,实际上程序内部能自动处理这些字符。
这里是不是少了“>”我通过使用拦截器增加CDATA标记public class CDATAOutInterceptor extends AbstractPhaseInterceptor<Message> { public CDATAOutInterceptor() {
super(Phase.WRITE);
} @Override
public void handleMessage(Message message) throws Fault {
message.put("disable.outputstream.optimization", Boolean.TRUE);
XMLStreamWriter writer = StaxUtils.createXMLStreamWriter(message.getContent(OutputStream.class));
if(writer !=null)
{
message.setContent(XMLStreamWriter.class, new CDATAXMLStreamWriter(writer));
}
}}public class CDATAXMLStreamWriter extends DelegatingXMLStreamWriter { private String currentElementName; public CDATAXMLStreamWriter(XMLStreamWriter writer) {
super(writer);
} @Override
public void writeCharacters(String text) throws XMLStreamException {
boolean useCData = isNeedCData();
if (useCData) {
super.writeCData(text);
} else {
super.writeCharacters(text);
}
} private boolean isNeedCData() {
// 自己拓展哪些属性需要处理CDATA
if(currentElementName.equals("body"))
{
return true;
}else{
return false;
}
} public void writeStartElement(String prefix, String local, String uri) throws XMLStreamException {
currentElementName = local;
super.writeStartElement(prefix, local, uri);
}}
这样的方式是XML格式正常了,没有被转义了,但是SOAP报文格式乱了,SOAP HEAD BODY等位置全变了,
不能解析,后台程序直接就报错了,而且我用XML在线格式化,都提示格式错误,不知道该咋办了
不能解析,后台程序直接就报错了,而且我用XML在线格式化,都提示格式错误,不知道该咋办了
不知道了。
直接替换就可以了
因为客户端调用,需要把返回的soap报文转换为POJO对象。那么如果标签内的字符串里有特殊字符 <,>,&,是会转换失败的。因为转换器会把这些字符识别为标签 。所以在写入的时候。会自动进行转义。 比如你用SOAPUI 测,还是POSTMAN 测,都 是转义的。
但是!!!
当你用客户端调用的时候。xml转为POJO,这些转义字符在转换为String后会被转义回来。你可以用wsimport生成一个客户端调用试试看。
总结来说:soap 的xml只是调用生成的一个中间部分,最后需要得到的结果其实是客户端调用接口返回的对象。