1

JAXWS と wsimport を使用して Web サービスを利用しようとしています。WSIMPORT ツールによって必要なクラスがすべて生成され、問題なくサービスを呼び出すことができます。

しかし、応答に有効な属性値を持つ nil 要素が含まれている場合、JAXWS は非整列化に失敗し、NullPointerException をスローすることに気付きました。SOAP UI を使用してデバッグを行ったところ、次のような結果が得られました。応答は、次の XML (抜粋) を返します。

            <externalIdentifiers>
                 <identifierType code="2" name="Passport" xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
                 <identifierValue/>
                 <issuingCountry xsi:nil="true" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"/>
              </externalIdentifiers>

私の Java コードでは、上記のように識別子型の "name" プロパティを読み取ろうとすると、NPE がスローされます。

      if(id.getIdentifierType() == null)
            {
                System.out.println("NULL");
            }
            System.out.println("Identifier Type: " + id.getIdentifierType().getName());

出力:

NULL
Exception in thread "main" java.lang.NullPointerException

私には、応答のように妥当な応答に見えますが、identifierType は xsi:nil="true" に設定されています。これは、W3C に従って完全に有効な XML でもあります。質問は、このような場合、コードや名前などの属性値をどのように読み取るかです。

4

1 に答える 1

0

以下は、このユース ケースをサポートする方法です。

Java モデル

外部識別子

identifierTypeプロパティを のJAXBElement<IdentifierType>代わりにタイプに変更できますIdentifierType。これを行うには、プロパティに で注釈を付ける必要があります@XmlElementRef

import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.*;

@XmlRootElement
@XmlAccessorType(XmlAccessType.FIELD)
public class ExternalIdentifiers {

    @XmlElementRef(name="identifierType")
    private JAXBElement<IdentifierType> identifierType;

    public JAXBElement<IdentifierType> getIdentifierType() {
        return identifierType;
    }

}

ObjectFactory

で注釈が付けられたクラスの e メソッドに、対応する@XmlElementDecl注釈が必要になります。creat@XmlRegistry

import javax.xml.bind.JAXBElement;
import javax.xml.bind.annotation.*;
import javax.xml.namespace.QName;

@XmlRegistry
public class ObjectFactory {

    @XmlElementDecl(name="identifierType")
    public JAXBElement<IdentifierType> createIdentifierType(IdentifierType identifierType) {
        return new JAXBElement(new QName("identifierType"), IdentifierType.class, identifierType);
    }

}

デモコード

入力.xml

<?xml version="1.0" encoding="UTF-8"?>
<externalIdentifiers>
    <identifierType code="2" name="Passport" xsi:nil="true"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" />
</externalIdentifiers>

デモ

import java.io.File;
import javax.xml.bind.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        JAXBContext jc = JAXBContext.newInstance(ExternalIdentifiers.class, ObjectFactory.class);

        Unmarshaller unmarshaller = jc.createUnmarshaller();
        File xml = new File("src/forum18834036/input.xml");
        ExternalIdentifiers externalIdentifiers = (ExternalIdentifiers) unmarshaller.unmarshal(xml);

        System.out.println(externalIdentifiers.getIdentifierType().getValue().getName());
    }

}

出力

Passport

ノート

現在、このユース ケースに関してEclipseLink JAXB (MOXy)にバグがあります。

于 2013-09-16T19:20:18.493 に答える