【问题标题】:How to convert URL field using Dozer bean Mapper?如何使用 Dozer bean Mapper 转换 URL 字段?
【发布时间】:2015-04-22 19:25:12
【问题描述】:

我有以下类,当我使用 Dozer Bean Mapper 将ProductEntity 转换为Product 时,反之亦然:

public class ProductEntity(){   
    private String name;
    private String description;
    private URL site;
}

public class Product(){
    private String name;
    private String description;
    private URL site;        
}

我收到以下错误:

内部错误[java.lang.NoSuchMethodException: java.net.URL.<init>()

Dozer 与这个 URL 类不兼容,还是我做错了什么?

【问题讨论】:

  • 我们假设您的每个属性都有public 访问器(getters/setters)方法,对吧? - 另外,你能分享你的映射.xml文件(如果有的话)
  • @ochi 是的,我拥有所有公共访问器....但我找不到 mapping.xml
  • @MrPaulHenry - 很奇怪!您能分享一下您是如何进行映射的吗?
  • @ochi 我正在使用 BeanMappingBuilder builder = new BeanMappingBuilder() 代替 xml 配置
  • @MrPaulHenry 好的,但你能分享一些你是如何做的示例代码吗? - 也许某处有错字?缺少配置?还是...?

标签: java dozer


【解决方案1】:

自从我完成 Dozer 以来已经有一段时间了,但是您看到这个的原因是由于 Dozer 映射对象的方式。它希望仅通过调用无参数构造函数来创建一个新对象,并且由于 URL 没有,这就是您遇到该异常的原因。

解决此问题的方法是创建身份转换:将实体的一个实例映射到完全相同类型的实体。

我们这样做的方式分为两部分:

首先,在dozer.xml 文件中声明自定义配置。

<configuration>
    <custom-converters>
        <converter type="com.stackoverflow.URLConverter">
            <class-a>java.net.URL</class-a>
            <class-b>java.net.URL</class-b>
        </converter>
    </custom-converters>
</configuration>

接下来,创建一个新的 URLConverter 类,该类从 DozerConverter 扩展而来。它从 DozerConverter 而不是 CustomConverter 扩展的原因是为了简单和类型安全。

public class URLConverter extends DozerConverter<URL, URL> {

    public URLConverter() {
        super(URL.class, URL.class);
    }

    @Override
    public URL convertTo(URL source, URL destination) {
        URL result = null;
        try {
            result = source.toURI().toURL();
        } catch (MalformedURLException | URISyntaxException e) {
            throw e;
        }

        return result;
    }

    @Override
    public URL convertFrom(URL source, URL destination) {
        URL result = null;
        try {
            result = source.toURI().toURL();
        } catch (MalformedURLException | URISyntaxException e) {
           throw e;
        }

        return result;
    }
}

这里的过程相当机械:

  • 尝试将 URL 转换为 URI,然后将其转换回 URL。
  • 如果 URI 或 URL 有任何格式错误,请将其退回 - 我们不应该在这种状态下处理格式错误的 URL。
  • 否则,返回转换后的 URL 的结果。

【讨论】:

    【解决方案2】:

    在xml配置中添加如下语句:

    <configuration>
        <copy-by-references>
            <copy-by-reference>
                java.net.URI
            </copy-by-reference>
        </copy-by-references>
    </configuration>
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多