1

次のシナリオがあります。

プロジェクトには、1 つの汎用構成ファイルと 1 つの特定の構成ファイルがあります。jaxb アンマーシャリングを使用して、特定の構成ファイルのインスタンスを作成する必要があります。

スーパークラス ConfigA.java:

package net.test;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "config")
@XmlAccessorType(XmlAccessType.FIELD)
public class ConfigA {

private String attribute1;

private String attribute2;

public String getAttribute1() {
    return attribute1;
}

public void setAttribute1(String attribute1) {
    this.attribute1 = attribute1;
}

public String getAttribute2() {
    return attribute2;
}

public void setAttribute2(String attribute2) {
    this.attribute2 = attribute2;
}

}

サブクラス ConfigB.java:

package net.test;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlRootElement;

@XmlRootElement(name = "config")
@XmlAccessorType(XmlAccessType.FIELD)
public class ConfigB extends ConfigA {

private String attribute3;

public String getAttribute3() {
    return attribute3;
}

public void setAttribute3(String attribute3) {
    this.attribute3 = attribute3;
}
}

対応する xml ファイル:

<config>
    <attribute1>a</attribute1>
    <attribute2>b</attribute2>
    <attribute3>c</attribute3>
</config>

ファクトリ クラスは次のとおりです。

package net.test;

import java.io.InputStream;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Unmarshaller;

public class ConfigFactory {

    public static <T extends ConfigA> T createConfig(String file, Class<T> clazz) {
        T config = null;

        JAXBContext context = null;
        Unmarshaller unmarshaller = null;

        try {
            file = "/" + file;
            InputStream stream = ConfigFactory.class.getResourceAsStream(file);
            if (stream == null) {
                // Error handling
            }
            if (clazz != null) {
                context = JAXBContext.newInstance(ConfigA.class, clazz);
            } else {
                context = JAXBContext.newInstance(ConfigA.class);
            }
            unmarshaller = context.createUnmarshaller();

            unmarshaller.setSchema(null); // No Schema
            config = (T)unmarshaller.unmarshal(stream);

        } catch (JAXBException e) {
            // exception handling
        } catch (Exception e) {
            // exception handling
        }
        return config;
    }
}

そして今、junitテストは次のとおりです。

@Test
public void testConfig() throws Exception {
    ConfigB config = ConfigFactory.createConfig("config.xml", ConfigB.class);
    assertNotNull(config);
    assertEquals(config.getClass(), ConfigB.class);
}

これは、Sun の jaxb 参照実装: jaxb-impl-2.1.9.jar で問題なく動作しますが、Webshpere では、ConfigFactory.createConfig() メソッドは常に ConfigB ではなく ConfigA のインスタンスのみを返します。

createConfig() メソッドで次のことを試しました:

JAXBContext.newInstance(clazz, ConfigA.class);

JAXBContext.newInstance(clazz);

どちらのコードでも、jaxb リファレンス実装を使用しても ConfigA インスタンスのみが作成されます。

誰でも私を助けることができますか?

どうもありがとう!

4

0 に答える 0