如何使用Dozer bean Mapper转换URL字段?

时间:2015-04-22 19:25:13

标签: java dozer

我有以下类,当我使用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类不兼容,或者我做错了什么?

2 个答案:

答案 0 :(得分: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;
    }
}

这里的过程相当机械化:

  • 尝试将网址转换为URI,然后将其转换回网址。
  • 如果URI或网址出现任何格式错误,请将其丢回 - 无论如何我们都不应该在此状态下处理格式错误的网址。
  • 否则,返回转换后的网址的结果。

答案 1 :(得分:0)

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

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