【问题标题】:Mapping problem with Dozer and JAX-WS generated classesDozer 和 JAX-WS 生成的类的映射问题
【发布时间】:2010-11-12 10:35:46
【问题描述】:

我有一组 JAX-WS 生成的类,它们在另一个包中重复。现在我想使用 Dozer 在这些类之间进行映射。我现在遇到的问题是基于 JAX-WS 没有为 Collection 类型生成设置器。我必须打电话给getFoo().addAll(List<Foo>),而不是打电话给set(List<Foo> foo)。 我如何配置 Dozer(通过 XML 和 API)来尊重这一点?

【问题讨论】:

    标签: jax-ws dozer


    【解决方案1】:

    好的,我想出了如何使用静态推土机 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>
    

    我缺少所需的&lt;b-hint&gt;bar.Item&lt;/b-hint&gt;。 现在我只需要在运行时通过 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));
            }
        };
    

    【讨论】:

    • 您使用的是什么版本的推土机?据我所知,这不适用于最新版本(5.3.2)
    猜你喜欢
    • 2012-09-15
    • 1970-01-01
    • 2016-09-15
    • 2017-01-15
    • 2014-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-07
    相关资源
    最近更新 更多