3

私はjaxbにEclipseLink動的moxyを使用しています。列挙値を設定しようとすると、ClassNotFound 例外が発生します。誰かが私が間違っていることを指摘できますか?

スキーマ:

<xs:element name="customer" type="customerType"> </xs:element>

 <xs:complexType name="customerType">
    <xs:sequence>
        <xs:element name="number" type="numberEnum"/>
        <xs:element name="name" type="xs:string"/>
    </xs:sequence>
</xs:complexType>

<xs:simpleType name="numberEnum">
    <xs:restriction base="xs:string">
        <xs:enumeration value="1"/>
        <xs:enumeration value="2"/>
        <xs:enumeration value="3"/>
    </xs:restriction>
</xs:simpleType>

Java コード:

    package uic;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

import javax.xml.bind.JAXBException;

import org.eclipse.persistence.dynamic.DynamicEntity;
import org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContext;
import org.eclipse.persistence.jaxb.dynamic.DynamicJAXBContextFactory;

public class test{

DynamicJAXBContext context;

test() {
    try{
        context = DynamicJAXBContextFactory.createContextFromXSD(new FileInputStream(new File("sample/NewXMLSchema1.xsd")), null, null, null);
    } catch(JAXBException e) {
        e.printStackTrace();
    } catch(FileNotFoundException e){
        e.printStackTrace();
    }

    DynamicEntity root = context.newDynamicEntity("CustomerType");

    root.set("name", "tom");

    Object enumValue = null;
    try {
        enumValue = context.getEnumConstant("uic.NumberEnum", "2");
    } catch (ClassNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (JAXBException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    root.set("Number", enumValue);
}

public static void main(String args[]) {
    new test();
}
}

createContextFromXSD() を使用してコンテキストを作成するとうまくいきませんか? 私は次の例に従いました:列挙値にアクセスする EclipseLink 動的 MOXy

他の JAXB 生成クラスにアクセスしているときは問題ありません。問題は enum クラスのみです。それらは、他の生成されたクラスなどとは別のパッケージに配置されていますか?

編集: メイン プログラムでは、入力として xml スキーマ ファイルを受け取ります。xsom パーサーを使用して要素と型の宣言を取得し、JAXB で生成されたクラスを使用してマーシャリングして、出力 (XML ファイル) を取得します。そのため、スキーマに必要な変更はすべて動的に行う必要があります。

ありがとう。

4

1 に答える 1

1

私は EclipseLink 製品の開発者であり、あなたの問題を調べています。列挙値がすべて数値であるため、NumberEnum クラスは生成されませんでした。これは Java 列挙には無効です。コマンドライン ツールを使用してスキーマを実行するxjcと、列挙型クラスが生成されていないこともわかります。

1 つの解決策は、スキーマを柔軟に変更できる場合、列挙型の値を ONE、TWO、THREE に変更することです。

それ以外の場合、これを回避する標準的な方法は、JAXB バインディング ファイルを使用して列挙値をカスタマイズすることです。

    <jxb:bindings
        xmlns:xs="http://www.w3.org/2001/XMLSchema"
        xmlns:jxb="http://java.sun.com/xml/ns/jaxb"
        version="2.1">
        <jxb:bindings schemaLocation="schema.xsd">

            <jxb:bindings node="//xs:simpleType[@name='numberEnum']/xs:restriction/xs:enumeration[@value='1']">
                <jxb:typesafeEnumMember name="ONE"/>
            </jxb:bindings>

            <jxb:bindings node="//xs:simpleType[@name='numberEnum']/xs:restriction/xs:enumeration[@value='2']">
                <jxb:typesafeEnumMember name="TWO"/>
            </jxb:bindings>

            <jxb:bindings node="//xs:simpleType[@name='numberEnum']/xs:restriction/xs:enumeration[@value='3']">
                <jxb:typesafeEnumMember name="THREE"/>
            </jxb:bindings>

        </jxb:bindings>
    </jxb:bindings>

ただし、現在、EclipseLink Dynamic JAXB にバグがあり、この列挙型のカスタマイズは考慮されていません。2.4.1 リリースに向けて取り組んでいます。このバグの進行状況はこちらで追跡できます。

https://bugs.eclipse.org/bugs/show_bug.cgi?id=383575

ありがとう、

リック

于 2012-06-26T17:39:42.547 に答える