Проблема с отображением в Dozer и JAX-WS сгенерированных классах - PullRequest
1 голос
/ 12 ноября 2010

У меня есть набор сгенерированных классов JAX-WS, которые дублируются в другом пакете. Теперь я хочу отобразить эти классы с помощью Dozer. Проблема, с которой я столкнулся, основана на том, что JAX-WS не генерирует сеттеры для типов коллекций. Вместо того, чтобы звонить set(List<Foo> foo), я должен позвонить getFoo().addAll(List<Foo>). Как я могу настроить Dozer (через XML и API) для соблюдения этого?

1 Ответ

2 голосов
/ 12 ноября 2010

Хорошо, я разобрался, как это сделать со статической конфигурацией XML Dozer:

<?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));
        }
    };
...