我尝试使用SOAP服务,用maven cxf-codegen-plugin生成存根。大多数服务都很好,除了一个难看的服务。在这种情况下,当被调用时,服务发送一个正确的响应,但是我生成的存根无法解组它,从而生成一个异常,比如(我用一个类似urlx的名称替换了URL,以简化) :
javax.xml.ws.soap。SOAPFaultException:解组错误:意外元素(uri:“url3”,local:“cap”)。预期元素为
实际上,意外字段是扩展的一部分,该扩展具有与扩展元素不同的指定命名空间。这里的命名空间def:
<?xml version="1.0" encoding="UTF-8"?>
<wsdl:definitions ...xmlns:ns1="url1" ... xmlns:ns3="url3" ... targetNamespace="someUrl">
<wsdl:documentation>WSDatiPersonali</wsdl:documentation>
<wsdl:types>
<xs:schema xmlns:ax226="url0" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="url0">
扩展的 xs 如下:
<xs:schema xmlns:ax225="url1" xmlns:ax227="url0" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="url1">
<xs:import namespace="url0"/>
<xs:complexType name="Indirizzo">
<xs:sequence>
<xs:element minOccurs="0" name="cap" nillable="true" type="xs:string"/>
</xs:sequence>
</xs:complexType>
扩展的一个是:
<xs:schema xmlns:ax224="url3" attributeFormDefault="qualified" elementFormDefault="qualified" targetNamespace="url3">
<xs:complexType name="Indirizzo">
<xs:complexContent>
<xs:extension base="ns1:Indirizzo">
<xs:sequence>
............
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
</xs:schema>
如您所见,“cap”字段位于父亲内部,当儿子的字段填充到服务响应中时,cxf无法在儿子的命名空间下找到它。
有办法修理吗?
最后,我找到了某种禁用soap验证的变通方法。事实上,有很多方法可以做到:
> < li>
在响应类上使用注释,如:
@org.apache.cxf.annotations.EndpointProperty(key = "soap.no.validate.parts", value = "true")
设置服务存根的属性:
JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setServiceClass(YourServiceClass.class);
factory.setAddress(this.constants.SOME_URL);
Map<String, Object> properties = factory.getProperties();
if(properties==null){
properties= new HashMap<String, Object>();
}
properties.put("soap.no.validate.parts", "true");
/**
* an other option is :
* properties.put("set-jaxb-validation-event-handler", "false");
*/
factory.setProperties(properties);
WSDatiPersonaliPortType port = (WSDatiPersonaliPortType) factory.create();
我希望这对其他人有用。
我正试图将我的web服务客户机从Apache AXIS-1迁移到Apache CXF。web服务本身运行om AXIS-1,不受我的控制。 我生成了所有CXF工件,客户端一直工作良好,直到服务抛出任何错误。错误的XML如下所示: 这使得CXF生成的客户端异常下降: AFAIU在这个stacktrace中,unmarshaller希望fault元素有特定的命名空间声明,但它没有。 添加带有默认命名空
背景: 我使用JAXB将XML解组为Java对象。最初,我只是使用JAXB来执行解组。然后对代码进行静态分析,并提出了XML外部实体注入的高关键性问题。经过一点研究,我发现了一个建议(https://www.owasp.org/index.php/XML_External_Entity_(XXE)_Prevention_Cheat_Sheet#JAXB_Unmarshaller)使用配置为防止解析
Borrower类使用基于XSD的JaxB解析,使用JDK1.7和Eclipse IDE。 : } XSD: XML:
为什么在使用JAXB时需要使用? 我的工作场景是这样的: 我正在做一个从.NET到Java的转换项目。在.NET中,类的编写与POJO类似。我只是在代码中添加了注释(如、等)。并解决了与注释相关的错误。 现在我犯了这样的错误: XML文件如下: POJO类:
我尝试解组一个XML文件到一个对象。 我得到了这个错误: 我的解组过程如下所示: 我的XML实体看起来像: 我的XMLFile看起来像: 那么,我的解组过程出了什么问题?XML实体是用xjc创建的。 我也尝试了简单的xml文件/对象。这对我来说很好。
第22行是: 我不知道为什么我会得到这个,我已经检查了我的语法,所有似乎是正确的。它基本上不喜欢执行查询后的任何内容 编辑: 我明白这是容易SQL注入,但我这样做只是为了测试目的。