別のパッケージに複製されている一連の JAX-WS 生成クラスがあります。ここで、Dozer を使用してこれらのクラス間をマッピングしたいと考えています。私が今抱えている問題は、コレクション型のセッターを生成しない JAX-WS に基づいています。電話する代わりに、電話set(List<Foo> foo)
する必要がありますgetFoo().addAll(List<Foo>)
。これを尊重するように Dozer を (XML および API 経由で) 構成するにはどうすればよいですか?
1940 次
1 に答える
2
わかりました、静的ドーザーxml構成でそれを行う方法を見つけました:
<?xml version="1.0" encoding="UTF-8"?>
<mappings xmlns="http://dozer.sourceforge.net" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://dozer.sourceforge.net
http://dozer.sourceforge.net/schema/beanmapping.xsd">
<mapping>
<class-a>foo.ArrayOfItem
</class-a>
<class-b>bar.ArrayOfItem</class-b>
<field>
<a>item</a>
<b set-method="getItem().addAll">item</b>
<b-hint>bar.Item</b-hint>
</field>
</mapping>
<mapping>
<class-a>foo.Item</class-a>
<class-b>bar.Item</class-b>
</mapping>
必要な がありませんでした<b-hint>bar.Item</b-hint>
。これで、実行時に Dozer API を介してこれを行うだけで済みます...
java.lang.ClassCastException: foo.Item cannot be cast to bar.Item
ヒントが何らかの形で適用されないため、これは失敗します。
BeanMappingBuilder mappingBuilder = new BeanMappingBuilder() {
@Override
protected void configure() {
mapping(
"foo.ArrayOfItem",
"bar.ArrayOfItem").fields("item", "item",
new FieldsMappingOption() {
public void apply(
FieldMappingBuilder fieldMappingBuilder) {
FieldDefinitionBuilder itemFieldDefinitionBuilder = fieldMappingBuilder
.b("item");
itemFieldDefinitionBuilder
.theSetMethod("getItem().addAll");
}
}).hintB(bar.Item.class);
}
};
これがどのように機能するかです:
BeanMappingBuilder mappingBuilder = new BeanMappingBuilder() {
@Override
protected void configure() {
mapping(
"foo.ArrayOfItem",
"bar.ArrayOfItem").fields("item", "item",
new FieldsMappingOption() {
public void apply(
FieldMappingBuilder fieldMappingBuilder) {
FieldDefinitionBuilder itemFieldDefinitionBuilder = fieldMappingBuilder
.b("item");
itemFieldDefinitionBuilder
.theSetMethod("getItem().addAll");
}
}, FieldsMappingOptions.hintB(bar.Item.class));
}
};
于 2010-11-12T10:57:24.750 に答える