Java 为映射项生成ID
在我们的项目中,习惯上对所有映射使用mapstruct。在这个独特的例子中,我不是创建实体,而是创建DTO。然而,这个DTO需要我生成一个UUID,我不想使用表达式选项Java 为映射项生成ID,java,spring-boot,mapstruct,Java,Spring Boot,Mapstruct,在我们的项目中,习惯上对所有映射使用mapstruct。在这个独特的例子中,我不是创建实体,而是创建DTO。然而,这个DTO需要我生成一个UUID,我不想使用表达式选项 @Mapping(target = "trackId", expression = "java(UUID.randomUUID().toString())") FileUploadRequest inventoryToFileUpload(Inventory inventory); 我宁
@Mapping(target = "trackId", expression = "java(UUID.randomUUID().toString())")
FileUploadRequest inventoryToFileUpload(Inventory inventory);
我宁愿把编译器作为我一生中的朋友。另外,如果生成策略不是一行30个字符宽,您会怎么做
我推荐的方法如下:
@Mapping(target = "trackId", qualifiedByName = "generateUUID"),
FileUploadRequest inventoryToFileUpload(Inventory inventory);
@Named("generateUUID")
default String generateUuid() {
return UUID.randomUUID().toString();
}
遗憾的是,上述方法不起作用。我必须给它一个来源,这是胡说八道。或者有一种方法可以指定我不依赖任何参数
以下是有效的代码:
// Ommiting other mappings for clarity
@Mapping(target = "trackId", source = "id", qualifiedByName = "generateUUID")
FileUploadRequest inventoryToFileUpload(Inventory inventory);
@Named("generateUUID")
default String generateUuid(final String nonsense) {
return UUID.randomUUID().toString();
}
这将生成以下代码行
fileUploadRequest.setTrackId(this.generateUuid(inventory.getId()));
但是。。。很容易看出,该参数是超级函数。我知道这其实并不重要。但这似乎是一个疏忽,或者我不明白如何声明我没有这方面的源代码,我只是希望映射程序调用我的方法
同样,
表达式
不是有效答案,请不要提出。除非您能够执行expression=“java(generateuid())”
?MapStruct是关于不同对象之间的映射。这就是为什么不能使用空方法(没有expression
)
我建议确实使用映射#表达式
。但是,为了简化它,您可以使用以下方法:
public class MappingUtils {
public static String GENERATE_UUID_EXPRESSION = "java(" + MappingUtils.class.getCanonicalName() + ".generateUuid())"
public static String generateUuid() {
return UUID.randomUUID().toString();
}
}
然后在地图绘制程序中,您可以执行以下操作:
@Mapper
public interface MyMapper {
@Mapping(target = "trackId", expression = MappingUtils. GENERATE_UUID_EXPRESSION)
FileUploadRequest inventoryToFileUpload(Inventory inventory);
}
执行此操作时,表达式位于单个位置,并且有一个执行生成的方法
生成的代码将使用
MappingUtils
的完整限定名。为了避免这种情况,您需要将MappingUtils
添加到Mapper\imports
中,然后在表达式中使用MappingUtils.class.getName()
。“我更希望编译器在生命中的任何时候都是朋友。”-即使有了表达式,编译器也在您身边。MapStruct编写.java文件,然后由编译器编译。如果表达式中出现语法错误,则会出现编译错误。尽管如此,我还是提到了使用长代码的用例。也许是几行?如果我只想调用一个方法而不调用其他方法呢?据我所知,这可以通过表达式
,再加上默认
方法来实现。您是否尝试重写类的hashCode函数?“同样,表达式
不是有效答案,请不要提出。除非您可以执行expression=“java(generateuid())”
?“-为什么不试试呢?