【问题标题】:dozer Boolean property mappingdozer 布尔属性映射
【发布时间】:2011-04-27 10:44:17
【问题描述】:

如果布尔属性的访问器定义为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(),它就会通过。

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

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

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

【问题讨论】:

  • 您是否正在使用 JAXB 来生成您的 DTO?
  • 是的,有什么方法可以让它生成获取访问器?
  • 请注意,Dozer 只有在 is 方法的类型为 Boolean 时才会这样做 - 它可以很好地映射 boolean isFoo() 方法。

标签: java groovy dozer


【解决方案1】:

也许你可以使用自定义的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。 希望这对你有用。 :)

【讨论】:

    【解决方案2】:

    为布尔包装类生成“i​​s”方法是 JAXB 中的一个错误,有关详细信息,请参阅 Java Beans, BeanUtils, and the Boolean wrapper classhttp://java.net/jira/browse/JAXB-131。似乎已在 jaxb 2.1.13 中修复

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 谢谢,知道在哪里可以找到这个插件(上面的链接不起作用)以及如何将它与 ant wsimport 任务一起使用?
      • 抱歉,把链接弄乱了。现已修复。
      • 恐怕我是在 Maven 中使用它
      • 我想出了如何将它与 Ant 集成,但它失败了这个错误[java] java.util.ServiceConfigurationError: com.sun.tools.xjc.Plugin: Provider org.jvnet.jaxb2_commons.BooleanGetter could not be instantiated: java.lang.ClassCastException
      • 看起来像一个 ant 配置问题...你能得到更多的堆栈跟踪吗?如果你使用命令行xjc可以吗?
      【解决方案4】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-11-06
        • 1970-01-01
        • 2019-02-16
        • 2012-06-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多