Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为映射项生成ID_Java_Spring Boot_Mapstruct - Fatal编程技术网

Java 为映射项生成ID

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); 我宁

在我们的项目中,习惯上对所有映射使用mapstruct。在这个独特的例子中,我不是创建实体,而是创建DTO。然而,这个DTO需要我生成一个UUID,我不想使用表达式选项

@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())”
?“-为什么不试试呢?