为包含xmldsig的xsd启动cxf客户端时出错

时间:2017-06-02 10:41:40

标签: java cxf xml-signature

我们目前正在开发包含第三方XSD的webservive。此第三方XSD包含数字签名(导入http://www.w3.org/2000/09/xmldsig# XSD)。

该架构有两个主要功能:

  1. 我们的Web服务接受根据第三方XSD合同的消息
  2. 我们将其中一些消息转发给另一个(也是第三方) 通过小客户端的webservice
  3. 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-in​​terface:

    @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
    

    我只是不明白这是怎么回事。或者我在这里碰到了一个错误?

1 个答案:

答案 0 :(得分:0)

主要问题是

的实例
  

com.sun.xml.internal.bind.v2.runtime.IllegalAnnotationsException:1   IllegalAnnotationExceptions的计数两个类具有相同的XML   输入名称“xxx”。使用@ XmlType.name和@ XmlType.namespace

这个问题已经解决了。

至于为什么这个错误在框架内部被严重破坏而不是明确地给出,我不知道。我之前看到过这个错误,一旦知道它很清楚该做什么。也许在那里某处有一个错误,谁知道呢。