如何使用 Dozer bean Mapper 转换 URL 字段?
How to convert URL field using Dozer bean Mapper?
我有以下 classes,当我使用 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;
}
我收到以下错误:
Internal error [java.lang.NoSuchMethodException: java.net.URL.<init>()
Dozer 与此 URL class 不兼容,还是我做错了什么?
自从我完成 Dozer 以来已经有一段时间了,但你看到这个的原因是由于 Dozer 映射对象的方式。它希望仅通过调用无参数构造函数来创建一个新对象,并且由于 URL
没有,这就是您得到该异常的原因。
解决这个问题的方法是创建一个身份转换:将实体的一个实例映射到完全相同类型的实体。
我们的方法分为两部分:
首先,在您的 dozer.xml
文件中声明自定义配置。
<configuration>
<custom-converters>
<converter type="com.Whosebug.URLConverter">
<class-a>java.net.URL</class-a>
<class-b>java.net.URL</class-b>
</converter>
</custom-converters>
</configuration>
接下来,创建一个从 DozerConverter
扩展而来的新 URLConverter
class。它从 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。
- 否则,return转换后的结果URL。
在 xml 配置中添加以下语句:
<configuration>
<copy-by-references>
<copy-by-reference>
java.net.URI
</copy-by-reference>
</copy-by-references>
</configuration>
我有以下 classes,当我使用 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;
}
我收到以下错误:
Internal error
[java.lang.NoSuchMethodException: java.net.URL.<init>()
Dozer 与此 URL class 不兼容,还是我做错了什么?
自从我完成 Dozer 以来已经有一段时间了,但你看到这个的原因是由于 Dozer 映射对象的方式。它希望仅通过调用无参数构造函数来创建一个新对象,并且由于 URL
没有,这就是您得到该异常的原因。
解决这个问题的方法是创建一个身份转换:将实体的一个实例映射到完全相同类型的实体。
我们的方法分为两部分:
首先,在您的 dozer.xml
文件中声明自定义配置。
<configuration>
<custom-converters>
<converter type="com.Whosebug.URLConverter">
<class-a>java.net.URL</class-a>
<class-b>java.net.URL</class-b>
</converter>
</custom-converters>
</configuration>
接下来,创建一个从 DozerConverter
扩展而来的新 URLConverter
class。它从 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。
- 否则,return转换后的结果URL。
在 xml 配置中添加以下语句:
<configuration>
<copy-by-references>
<copy-by-reference>
java.net.URI
</copy-by-reference>
</copy-by-references>
</configuration>