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()
方法时才会这样做。谢谢,我知道在哪里可以找到这个插件吗(上面的链接不起作用)以及我如何在antwsimport
任务中使用它?抱歉,弄乱了链接。现在已修复。我担心我正在将它与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>