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

标签 java dozer

我有以下类,当我使用Dozer Bean Mapper进行转换时ProductEntityProduct ,反之亦然:

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

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

我收到以下错误:

Internal error [java.lang.NoSuchMethodException: java.net.URL.<init>()

Dozer 是否与此 URL 类不兼容,或者我做错了什么?

最佳答案

自从我完成 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>

接下来,创建一个从 DozerConverter 扩展的新 URLConverter 类。它从 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。
  • 否则,返回转换后的网址结果。

关于java - 如何使用 Dozer bean Mapper 转换 URL 字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29807047/

相关文章:

java - 使用jdk 1.6和jdk 1.7进行不同的eclipse程序

java - 应用程序在 Liberty 17.0.0.4 上停止运行(在 17.0.0.3 上运行)

java - 使用点分隔字符串访问(私有(private))成员

java - 如何使用 Dozer 将字符串值映射到字符串列表?

java - Groovy 中的 "Copy Only If Exists Pattern"?

Java - 不同的对象列表

java - 如何在java中获取映射中对(键)值的总和?

java - 推土机将非通用集合映射到属性

jpa - org.dozer.MappingException : No read or write method found for field

java - 如何使用 SuperCsv 隔离类的实例?