2015-04-22 98 views
1

我有以下类和当我用推土机豆映射到ProductEntity转换为Product,反之亦然:如何使用Dozer bean Mapper转换URL字段?

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

是推土机与此URL不兼容班,还是我做错了什么?

+0

我们假设你有每个属性的'public'访问器(getters/setters)方法,对吧? - 另外,你可以分享你的映射'.xml'文件(如果有的话) – ochi

+0

@ochi是的,我有所有公共访问器....但我找不到mapping.xml – Phopes

+0

@MrPaulHenry - 怪异!你能分享你如何做这个映射吗? – ochi

回答

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,然后将其转换回一个网址。
  • 如果URI或URL存在任何格式错误,请将其退回 - 我们不应该在此状态下处理格式不正确的URL。
  • 否则,返回转换后的URL的结果。
相关问题