dozer 布尔属性映射

发布于 2024-11-03 10:56:36 字数 891 浏览 0 评论 0原文

如果布尔属性的访问器定义为 isProperty() 而不是 getProperty(),Dozer 似乎不会映射该属性。

以下 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() ,它就会通过。

我可以在 Dozer 映射文件中设置一个标志/选项来指示它使用 isget 访问器来获取布尔属性吗?或者,我可以为每个布尔属性添加自定义规则,但这不是很有吸引力。

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

这些 DTO 由 JAXB 生成(它生成“is”访问器,而不是布尔值的“get”访问器),因此我无法重命名访问器。我正在使用推土机 5.3.2。

It appears that Dozer will not map a Boolean property if the accessor of that property is defined as isProperty() rather than getProperty().

The following groovy script illustrates the problem:

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

The assertion on the final line fails. However, if I rename ProductDto.isFoo() to ProductDto.getFoo() it passes.

Is there a flag/option I can set in the Dozer mapping file that will instruct it to use either an is or get accessor for boolean properties? Alternatively, I could add a custom rule for every boolean property, but this is not very appealing.

Although the example above is written in Groovy, I've no reason to believe the same behaviour wouldn't be exhibited by the equivalent Java code.

These DTOs are generated by JAXB (which generates an "is" accessor, rather than a "get" accessor for booleans), so I can't rename the accessors. I'm using Dozer 5.3.2.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

恬淡成诗 2024-11-10 10:56:36

也许您可以使用自定义 getter 方法来使用它。

这是示例映射(将其写入 dozer-mapping 文件),

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

因此现在 dozer 将使用 isFoo 而不是预定义的 getFoo。
希望这对你有用。 :)

May be you can use custom getter method to use it.

here s the example mapping (Write it in dozer-mapping file)

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

So now dozer will use isFoo instead of predefined getFoo.
Hope this works for you. :)

感情废物 2024-11-10 10:56:36

为布尔包装类生成“i​​s”方法是 JAXB 中的一个错误,请参阅 Java Bean、BeanUtils 和布尔包装类http://java.net/jira/browse/JAXB-131 了解详细信息。似乎已在 jaxb 2.1.13 中修复

Generating "is" methods for the Boolean wrapper class is a bug in JAXB, see Java Beans, BeanUtils, and the Boolean wrapper class and http://java.net/jira/browse/JAXB-131 for details. Seems to be fixed in jaxb 2.1.13

垂暮老矣 2024-11-10 10:56:36

这是 JAXB 中的一个错误,小 b boolean 应该有 isFoo()。您可以在更高版本的 JAXB 中使用 -enableIntrospection 选项,或者使用旧的布尔 getter xjc 插件 http://fisheye5.cenqua.com/browse/~raw,r=MAIN/jaxb2-commons/www/boolean-getter/index.html

This is a bug in JAXB, the small-b boolean should have isFoo(). You can either use the -enableIntrospection option with later versions of JAXB, or use the oldish boolean getter xjc plugin http://fisheye5.cenqua.com/browse/~raw,r=MAIN/jaxb2-commons/www/boolean-getter/index.html

故笙诉离歌 2024-11-10 10:56:36

还有另一种方法可以实现正确的推土机映射(我认为最干净的方法):

<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>

There also is another way of achieving the correct dozer mapping (the cleanest in my opinion):

<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>

OR the way already mentioned earlier:

<mapping>
    <class-a>ProductDto</class-a>
    <class-b>ProductCommand</class-b>
    <field>
       <a get-method=”isFoo”>foo</a>
       <b>foo</b>
    </field>
</mapping>
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文