名前空間と ANY 要素を含む XML スキーマをコンパイルするために xjc を使用しています。必要に応じて外部の名前空間から要素を含め、要素定義の新しいバージョンが含まれる状況、または同じ名前の別の名前空間からの要素が含まれる状況を処理する必要があります。明らかに、これの XML バージョンは完全に機能しており、クライアント側のすべての要素に対して正しい QNAME を取得しますが、JSON については、要素名のみが存在する修飾されていない QNAME を取得します。これは、ある名前空間の「bob」という要素と、2 番目の名前空間の「bob」という別の要素を区別できないことを意味します。
見つけたすべての資料を読みましたが、これがサーバー側で必要なことだと思いますが、クライアント側で何が必要かわかりません。
@Provider
final static class JsonMoxyConfigurationContextResolver implements ContextResolver<MoxyJsonConfig> {
@Override
public MoxyJsonConfig getContext(Class<?> objectType) {
final MoxyJsonConfig configuration = new MoxyJsonConfig();
Map<String, String> namespacePrefixMapper = new HashMap<String, String>(2);
namespacePrefixMapper.put("http://schema.jaxbmoxy.examples.jersey.glassfish.org/2013/08/customer", "c");
namespacePrefixMapper.put("http://schema.jaxbmoxy.examples.jersey.glassfish.org/2013/08/other", "o");
configuration.setNamespacePrefixMapper(namespacePrefixMapper);
configuration.setNamespaceSeparator('.');
return configuration;
}
}
"c" スキーマは私が定義したベース スキーマであり、"o" スキーマは ANY を通じて組み込む要素定義を保持します。以下の例では、外部名前空間から o.stats と o.email をインポートしています。以下は、サーバー側で生成される JSON です。
{"c.customer": [
{
"id": "3",
"personal-info": {
"name": "Bobby Boogie",
"o.stats": [{
"age": "45",
"height": "160 cm",
"weight": "70 kg"
}]
},
"contact-info": {
"address": {
"city": "My Town",
"street": "123 Any Street",
"country": "CA"
},
"phone-number": [
{
"type": "work",
"value": "613-555-1111"
},
{
"type": "cell",
"value": "613-555-2222"
}
]
}
},
{
"id": "2",
"personal-info": {
"name": "Fred Finkleman",
"o.stats": [{
"age": "55",
"height": "182 cm",
"weight": "86 kg"
}]
},
"contact-info": {
"address": {
"city": "Fredsville",
"street": "1 Happy Street",
"country": "US"
},
"phone-number": [
{
"type": "work",
"value": "613-555-1111"
},
{
"type": "cell",
"value": "613-555-2222"
}
],
"o.email": ["fred@email.com"]
}
},
{
"id": "1",
"personal-info": {
"name": "Tom Dooley",
"o.stats": [{
"age": "45",
"height": "160 cm",
"weight": "70 kg"
}]
},
"contact-info": {
"address": {
"city": "My Town",
"street": "123 Any Street",
"country": "CA"
},
"phone-number": [
{
"type": "work",
"value": "613-555-1111"
},
{
"type": "cell",
"value": "613-555-2222"
}
]
}
}
]}
これを正しく機能させるには、クライアント側でどのような構成コードが必要ですか? 現時点では、次のものがあります。
@Override
protected void configureClient(ClientConfig clientConfig) {
clientConfig.register(new MoxyXmlFeature());
new ResourceConfig().property(MarshallerProperties.JSON_NAMESPACE_SEPARATOR, ".");
}
ありがとうございました!