我们目前正在开发包含第三方XSD的webservive。此第三方XSD包含数字签名(导入http://www.w3.org/2000/09/xmldsig# XSD)。
该架构有两个主要功能:
1)完美地运作,这里没有涉及签名的问题。
2)是奇怪的。只要签名元素
<xs:element ref="sig:Signature" minOccurs="0" maxOccurs="1"/>
存在,软件将无法启动,而是因此错误消息崩溃:
引起:org.springframework.beans.BeanInstantiationException: 无法实例化[net.eucaris.services.GenericServiceSoap]: 工厂方法'genericServiceSoap'抛出异常;嵌套异常 是java.lang.IllegalArgumentException:无法解析参数号: ''{0}''在 org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:189) [spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE] at org.springframework.beans.factory.support.ConstructorResolver.instantiateUsingFactoryMethod(ConstructorResolver.java:588) [spring-beans-4.3.8.RELEASE.jar:4.3.8.RELEASE] ... 38更多引起: java.lang.IllegalArgumentException:无法解析参数号: ''{0}'' at java.text.MessageFormat.makeFormat(MessageFormat.java:1429) [rt.jar:1.8.0_131] at java.text.MessageFormat.applyPattern(MessageFormat.java:479) [rt.jar:1.8.0_131] at java.text.MessageFormat中。(MessageFormat.java:362) [rt.jar:1.8.0_131] at java.text.MessageFormat.format(MessageFormat.java:840) [rt.jar:1.8.0_131] at com.sun.xml.bind.v2.model.impl.Messages.format(Messages.java:132) [JAXB-IMPL-2.2.11.jar:2.2.11]
我将其追溯到生成的文件,确切地说是porttype-interface:
@WebService(targetNamespace = "http://services.eucaris.net/", name = "GenericServiceSoap")
@XmlSeeAlso({org.w3._2000._09.xmldsig_.ObjectFactory.class, ObjectFactory.class})
public interface GenericServiceSoap {
...
只要在此处引用xmldsig-ObjectFactory,系统就会崩溃。一旦它出来,一切正常(好吧,直到有人发送签名,然后无法识别)。
深入挖掘(即调试)会让我了解这些信息:
这段代码抛出了异常(java.text.MessageFormat
,来自第1415行,jdk 1.8.131)
private void makeFormat(int position, int offsetNumber,
StringBuilder[] textSegments)
{
String[] segments = new String[textSegments.length];
for (int i = 0; i < textSegments.length; i++) {
StringBuilder oneseg = textSegments[i];
segments[i] = (oneseg != null) ? oneseg.toString() : "";
}
// get the argument number
int argumentNumber;
try {
argumentNumber = Integer.parseInt(segments[SEG_INDEX]); // always unlocalized!
} catch (NumberFormatException e) {
throw new IllegalArgumentException("can't parse argument number: "
+ segments[SEG_INDEX], e);
}
方法参数是73,0和包含此数据的StringBuilder
:
[Es ist keine ObjectFactory mit@XmlElementDeclfürdasElement', ''{0}'',null,null]
这表明,在某种程度上,某个地方,这个StringBuffer填充错误,因为该方法显然需要一个数字。 ''{0}'有点像占位符。考虑到消息的内容,应用程序本身会尝试引发错误或至少发出警告。
更多信息:
我们在Spring 4.3.8中使用了CXF 3.1.11。我们正在从wsdl和xsd文件生成代码。客户端是通过
创建的@Bean
public GenericServiceSoap genericServiceSoap() {
final JaxWsProxyFactoryBean factory = new JaxWsProxyFactoryBean();
factory.setAddress(http://example.com);
factory.setServiceClass(GenericServiceSoap.class);
factory.setInInterceptors(createInInterceptors());
factory.setOutInterceptors(createOutInterceptors());
return (GenericServiceSoap) factory.create();
}
签名生成这段代码,对我来说很好看:
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "SignatureType", propOrder = {
"signedInfo",
"signatureValue",
"keyInfo",
"objects"
})
@XmlRootElement(name = "Signature")
public class Signature implements Serializable
{
private final static Long serialVersionUID = 5363422069410258353L;
@XmlElement(name = "SignedInfo", required = true)
@NotNull
protected SignedInfo signedInfo;
@XmlElement(name = "SignatureValue", required = true)
@NotNull
protected SignatureValue signatureValue;
@XmlElement(name = "KeyInfo")
protected KeyInfo keyInfo;
@XmlElement(name = "Object")
protected List<org.w3._2000._09.xmldsig_.Object> objects;
@XmlAttribute(name = "Id")
@XmlJavaTypeAdapter(CollapsedStringAdapter.class)
@XmlID
@XmlSchemaType(name = "ID")
@Pattern(regexp = "[\\i-[:]][\\c-[:]]*")
protected String id;
// getters/setters omitted
我只是不明白这是怎么回事。或者我在这里碰到了一个错误?
答案 0 :(得分:0)
主要问题是
的实例com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException:1 IllegalAnnotationExceptions的计数两个类具有相同的XML 输入名称“xxx”。使用@ XmlType.name和@ XmlType.namespace
这个问题已经解决了。
至于为什么这个错误在框架内部被严重破坏而不是明确地给出,我不知道。我之前看到过这个错误,一旦知道它很清楚该做什么。也许在那里某处有一个错误,谁知道呢。