次のシナリオがあります。
プロジェクトには、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 インスタンスのみが作成されます。
誰でも私を助けることができますか?
どうもありがとう!