Java dozer布尔属性映射

Java dozer布尔属性映射,java,groovy,dozer,Java,Groovy,Dozer,如果将布尔属性的访问器定义为isProperty()而不是getProperty(),则推土机似乎不会映射该属性 以下groovy脚本说明了该问题: import org.dozer.* class ProductCommand { Boolean foo } public class ProductDto { private Boolean foo; public Boolean isFoo() { this.foo } pu

如果将布尔属性的访问器定义为
isProperty()
而不是
getProperty()
,则推土机似乎不会映射该属性

以下groovy脚本说明了该问题:

import org.dozer.*

class ProductCommand {
    Boolean foo 
}

public class ProductDto  {

    private Boolean foo;        

    public Boolean isFoo() { this.foo }    
    public void setFoo(Boolean p0) { this.foo = p0 }           
}

def mapper =  new DozerBeanMapper()

dto = new ProductDto(foo: true)
assert dto.isFoo()

ProductCommand mappedCmd = mapper.map(dto, ProductCommand)
assert mappedCmd.foo
最后一行的断言失败。但是,如果我将
ProductDto.isFoo()
重命名为
ProductDto.getFoo()
,它就会通过

我是否可以在推土机映射文件中设置一个标志/选项,指示它使用
Is
get
访问器访问布尔属性?或者,我可以为每个布尔属性添加一个自定义规则,但这不是很吸引人

尽管上面的示例是用Groovy编写的,但我没有理由相信相同的行为不会被等价的Java代码表现出来


这些DTO是由JAXB生成的(JAXB生成一个“is”访问器,而不是布尔值的“get”访问器),因此我不能重命名访问器。我正在使用Dozer 5.3.2。

为布尔包装类生成“is”方法是JAXB中的一个错误,有关详细信息,请参阅和。在jaxb 2.1.13中似乎已经修复了这是jaxb中的一个bug,small-b
boolean
应该具有
isFoo()
。您可以在JAXB的更高版本中使用-enableIntrospection选项,也可以使用老式的boolean getter xjc插件

可能您可以使用自定义getter方法来使用它

以下是示例映射(将其写入推土机映射文件)


生产的
ProductCommand
福
福
因此,现在推土机将使用isFoo而不是预定义的getFoo。
希望这对你有用。:)

还有另一种实现正确推土机测绘的方法(我认为是最干净的):


生产的
ProductCommand
福
福
或者前面已经提到的方式:

<mapping>
    <class-a>ProductDto</class-a>
    <class-b>ProductCommand</class-b>
    <field>
       <a get-method=”isFoo”>foo</a>
       <b>foo</b>
    </field>
</mapping>

生产的
ProductCommand
福
福

您是否有可能使用JAXB生成DTO?是的,我有,您是否有办法让它生成get访问器?请注意,Dozer只有在
is
方法具有类型
Boolean
-它映射
Boolean isFoo()
方法时才会这样做。谢谢,我知道在哪里可以找到这个插件吗(上面的链接不起作用)以及我如何在ant
wsimport
任务中使用它?抱歉,弄乱了链接。现在已修复。我担心我正在将它与MavenI一起使用。我找到了如何将它与ant集成的方法,但由于此错误而失败
[java]java.util.ServiceConfigurationError:com.sun.tools.xjc.Plugin:Provider org.jvnet.jaxb2_commons.BooleanGetter无法实例化:java.lang.ClassCastException
看起来像是一个ant配置问题……您能获得更多的堆栈跟踪吗?如果使用命令行xjc,它还能工作吗?
<mapping>
    <class-a>ProductDto</class-a>
    <class-b>ProductCommand</class-b>
    <field>
       <a is-accessible=”true”>foo</a>
       <b is-accessible=”true”>foo</b>
    </field>
</mapping>
<mapping>
    <class-a>ProductDto</class-a>
    <class-b>ProductCommand</class-b>
    <field>
       <a get-method=”isFoo”>foo</a>
       <b>foo</b>
    </field>
</mapping>