自从我做了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的结果。
我们假设你有每个属性的'public'访问器(getters/setters)方法,对吧? - 另外,你可以分享你的映射'.xml'文件(如果有的话) – ochi
@ochi是的,我有所有公共访问器....但我找不到mapping.xml – Phopes
@MrPaulHenry - 怪异!你能分享你如何做这个映射吗? – ochi