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

Java 为包含xmldsig的xsd启动cxf客户端时出错,java,cxf,xml-signature,Java,Cxf,Xml Signature,我们目前正在开发一个包含第三方XSD的WebService。此第三方XSD包含数字签名(导入XSD) 该体系结构有两个主要功能: 我们的Web服务根据第三方XSD合同接受消息 我们将其中一些消息转发给另一方(也是第三方) 通过小型客户机提供Web服务 1) 工作完美,这里没有涉及签名的问题 2) 这很奇怪。只要签名元素 <xs:element ref="sig:Signature" minOccurs="0" maxOccurs="1"/> 只要这里引用了xmldsig Objec

我们目前正在开发一个包含第三方XSD的WebService。此第三方XSD包含数字签名(导入XSD)

该体系结构有两个主要功能:

  • 我们的Web服务根据第三方XSD合同接受消息
  • 我们将其中一些消息转发给另一方(也是第三方) 通过小型客户机提供Web服务
  • 1) 工作完美,这里没有涉及签名的问题

    2) 这很奇怪。只要签名元素

    <xs:element ref="sig:Signature" minOccurs="0" maxOccurs="1"/>
    
    只要这里引用了xmldsig ObjectFactory,系统就会崩溃。一旦结束,一切正常(好吧,直到有人发送了签名,然后无法识别)

    深入挖掘(即调试)使我了解到以下信息:

    在这段代码中抛出异常(
    java.text.MessageFormat
    ,来自jdk 1.8.131第1415行)

    签名生成这段代码,在我看来很好:

    @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
    
    @xmlacessortype(xmlacesstype.FIELD)
    @XmlType(name=“SignatureType”,proporter={
    “签名信息”,
    “签名价值”,
    “keyInfo”,
    “对象”
    })
    @XmlRootElement(name=“签名”)
    公共类签名实现可序列化
    {
    私有最终静态长serialVersionUID=5363422069410258353L;
    @xmlement(name=“SignedInfo”,必需=true)
    @NotNull
    受保护的SignedInfo SignedInfo;
    @XmlElement(name=“SignatureValue”,必需=true)
    @NotNull
    受保护的SignatureValue SignatureValue;
    @xmlement(name=“KeyInfo”)
    受保护的KeyInfo-KeyInfo;
    @xmlement(name=“Object”)
    受保护的物品清单;
    @xmltattribute(name=“Id”)
    @XmlJavaTypeAdapter(CollapsedStringAdapter.class)
    @XmlID
    @XmlSchemaType(name=“ID”)
    @模式(regexp=“[\\i-[:]][\\c-[:]]*”)
    受保护的字符串id;
    //省略了getter/setter
    

    我只是不明白这是怎么发生的,为什么会发生。或者我在这里遇到了一个bug吗?

    主要的问题是

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

    这个问题解决了

    至于为什么这个错误在框架的深处被破坏,而不是清楚地给出,我没有任何线索。我以前见过这个错误,一旦知道了它,就很清楚该怎么做。也许在那里的某个地方有一个bug,谁知道呢

     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);
            }
    
    @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