ModelMapper 处理 java 8 个可选<MyObjectDto> 字段到可选<MyObject>
ModelMapper handling java 8 Optional<MyObjectDto> fields to Optional<MyObject>
我一直在使用 modelmapper 和 java 8 个 Optionals,因为它们是原始类型,所以工作正常;直到我将模型对象的一个字段更改为可选类型。然后一切都乱套了。事实证明,许多库不能很好地处理泛型。
结构如下
public class MyObjectDto
{
private Optional<MySubObjectDto> mySubObject;
}
public MyObject
{
privae Optional<MySubjObject> mySubObject;
}
当我尝试将 MyObjectDto
映射到 MyObject
时,modelmapper 调用
public void setMySubObject(Optional<MySubObject> mySubObject){
this.mySubObject = mySubObject;
}
with Optional<MySubObjectDto>
,我不明白这怎么可能(它们之间没有继承关系)。当然,那会很快崩溃。现在我已经改变了我的 setter 来接受 Dto 类型只是为了度过这一天,但这不会在长 运行 上起作用。有没有更好的方法来解决这个问题,还是我应该制造一个问题?
所以我深入研究了 modelmapper 代码并查看了一些通用实现:
modelMapper.createTypeMap(Optional.class, Optional.class).setConverter(new OptionalConverter());
public class OptionalConverter implements ConditionalConverter<Optional, Optional> {
public MatchResult match(Class<?> sourceType, Class<?> destinationType) {
if (Optional.class.isAssignableFrom(destinationType)) {
return MatchResult.FULL;
} else {
return MatchResult.NONE;
}
}
private Class<?> getElementType(MappingContext<Optional, Optional> context) {
Mapping mapping = context.getMapping();
if (mapping instanceof PropertyMapping) {
PropertyInfo destInfo = ((PropertyMapping) mapping).getLastDestinationProperty();
Class<?> elementType = TypeResolver.resolveArgument(destInfo.getGenericType(),
destInfo.getInitialType());
return elementType == TypeResolver.Unknown.class ? Object.class : elementType;
} else if (context.getGenericDestinationType() instanceof ParameterizedType) {
return Types.rawTypeFor(((ParameterizedType) context.getGenericDestinationType()).getActualTypeArguments()[0]);
}
return Object.class;
}
public Optional<?> convert(MappingContext<Optional, Optional> context) {
Class<?> optionalType = getElementType(context);
Optional source = context.getSource();
Object dest = null;
if (source != null && source.isPresent()) {
MappingContext<?, ?> optionalContext = context.create(source.get(), optionalType);
dest = context.getMappingEngine().map(optionalContext);
}
return Optional.ofNullable(dest);
}
}
我一直在使用 modelmapper 和 java 8 个 Optionals,因为它们是原始类型,所以工作正常;直到我将模型对象的一个字段更改为可选类型。然后一切都乱套了。事实证明,许多库不能很好地处理泛型。
结构如下
public class MyObjectDto
{
private Optional<MySubObjectDto> mySubObject;
}
public MyObject
{
privae Optional<MySubjObject> mySubObject;
}
当我尝试将 MyObjectDto
映射到 MyObject
时,modelmapper 调用
public void setMySubObject(Optional<MySubObject> mySubObject){
this.mySubObject = mySubObject;
}
with Optional<MySubObjectDto>
,我不明白这怎么可能(它们之间没有继承关系)。当然,那会很快崩溃。现在我已经改变了我的 setter 来接受 Dto 类型只是为了度过这一天,但这不会在长 运行 上起作用。有没有更好的方法来解决这个问题,还是我应该制造一个问题?
所以我深入研究了 modelmapper 代码并查看了一些通用实现:
modelMapper.createTypeMap(Optional.class, Optional.class).setConverter(new OptionalConverter());
public class OptionalConverter implements ConditionalConverter<Optional, Optional> {
public MatchResult match(Class<?> sourceType, Class<?> destinationType) {
if (Optional.class.isAssignableFrom(destinationType)) {
return MatchResult.FULL;
} else {
return MatchResult.NONE;
}
}
private Class<?> getElementType(MappingContext<Optional, Optional> context) {
Mapping mapping = context.getMapping();
if (mapping instanceof PropertyMapping) {
PropertyInfo destInfo = ((PropertyMapping) mapping).getLastDestinationProperty();
Class<?> elementType = TypeResolver.resolveArgument(destInfo.getGenericType(),
destInfo.getInitialType());
return elementType == TypeResolver.Unknown.class ? Object.class : elementType;
} else if (context.getGenericDestinationType() instanceof ParameterizedType) {
return Types.rawTypeFor(((ParameterizedType) context.getGenericDestinationType()).getActualTypeArguments()[0]);
}
return Object.class;
}
public Optional<?> convert(MappingContext<Optional, Optional> context) {
Class<?> optionalType = getElementType(context);
Optional source = context.getSource();
Object dest = null;
if (source != null && source.isPresent()) {
MappingContext<?, ?> optionalContext = context.create(source.get(), optionalType);
dest = context.getMappingEngine().map(optionalContext);
}
return Optional.ofNullable(dest);
}
}