Art*_*yan 30 java class dto spring-boot mapstruct
我正在MVC REST用Spring Boot和编写一个应用程序Hibernate。我决定DTO使用MAPSTRUCT. 看来我按照指南做了一切,但出现了错误。有什么问题,我无法理解。论坛和google上的信息很少。
PS 起初我以为问题出在Lombok,所以我删除Lombok并手动分配getters / setters。然后问题并没有解决。我在Drink课堂上和DrinkDTO我规定的课程中都参加了getters / setters。但这仍然没有帮助。
喝:
@Entity
@Table(name = "drink", schema = "public")
public class Drink {
public Drink() { // Constructor for Hibernate
}
// Fields
//
private @Id
@GeneratedValue
Long id;
@Column(name = "name")
private String name;
@Column(name = "price")
private float price;
@Column(name = "about")
private String about;
@Column(name = "is_deleted")
private boolean isDeleted;
// Relationships
//
@ManyToOne
@JoinColumn(name = "packaging_id")
private Packaging packaging;
@ManyToOne
@JoinColumn(name = "manufacturer_id")
private Manufacturer manufacturer;
@ManyToOne
@JoinColumn(name = "country_id")
private Countries countries;
}
Run Code Online (Sandbox Code Playgroud)
喝DTO:
public class DrinkDTO {
// Fields
//
private String drinkName;
private float drinkPrice;
private String drinkAbout;
private Packaging drinkPackaging;
private Manufacturer drinkManufacturer;
private Countries drinkCountries;
// Getters and Setters
//
public String getDrinkName() {
return drinkName;
}
public void setDrinkName(String drinkName) {
this.drinkName = drinkName;
}
public float getDrinkPrice() {
return drinkPrice;
}
public void setDrinkPrice(float drinkPrice) {
this.drinkPrice = drinkPrice;
}
public String getDrinkAbout() {
return drinkAbout;
}
public void setDrinkAbout(String drinkAbout) {
this.drinkAbout = drinkAbout;
}
public Packaging getDrinkPackaging() {
return drinkPackaging;
}
public void setDrinkPackaging(Packaging drinkPackaging) {
this.drinkPackaging = drinkPackaging;
}
public Manufacturer getDrinkManufacturer() {
return drinkManufacturer;
}
public void setDrinkManufacturer(Manufacturer drinkManufacturer) {
this.drinkManufacturer = drinkManufacturer;
}
public Countries getDrinkCountries() {
return drinkCountries;
}
public void setDrinkCountries(Countries drinkCountries) {
this.drinkCountries = drinkCountries;
}
// toSTRING
@Override
public String toString() {
return "DrinkDTO{" +
"drinkName='" + drinkName + '\'' +
", drinkPrice=" + drinkPrice +
", drinkAbout='" + drinkAbout + '\'' +
", drinkPackaging=" + drinkPackaging +
", drinkManufacturer=" + drinkManufacturer +
", drinkCountries=" + drinkCountries +
'}';
}
Run Code Online (Sandbox Code Playgroud)
客户控制器:
@GetMapping("/drinks")
List<DrinkDTO> getAllDrinks(){
return DrinkMapper.INSTANCE.drinksToDrinksDTO(customerService.getAllDrinks());
}
Run Code Online (Sandbox Code Playgroud)
构建.Gradle
// Mapstruct
implementation 'org.mapstruct:mapstruct:1.3.1.Final'
annotationProcessor 'org.mapstruct:mapstruct-processor:1.3.1.Final'
Run Code Online (Sandbox Code Playgroud)
饮料映射器:
@Mapper
public interface DrinkMapper {
DrinkMapper INSTANCE = Mappers.getMapper(DrinkMapper.class);
@Mapping(source = "name", target = "drinkName")
@Mapping(source = "price", target = "drinkPrice")
@Mapping(source = "about", target = "drinkAbout")
@Mapping(source = "packaging", target = "drinkPackaging")
@Mapping(source = "manufacturer", target = "drinkManufacturer")
@Mapping(source = "countries", target = "drinkCountries")
DrinkDTO drinkToDrinkDTO(Drink drink);
@Mapping(source = "drinkName", target = "name")
@Mapping(source = "drinkPrice", target = "price")
@Mapping(source = "drinkAbout", target = "about")
@Mapping(source = "drinkPackaging", target = "packaging")
@Mapping(source = "manufacturer", target = "drinkManufacturer")
@Mapping(source = "countries", target = "drinkCountries")
Drink drinkDTOtoDrink(DrinkDTO drinkDTO);
@Mapping(source = "name", target = "drinkName")
@Mapping(source = "price", target = "drinkPrice")
@Mapping(source = "about", target = "drinkAbout")
@Mapping(source = "packaging", target = "drinkPackaging")
@Mapping(source = "manufacturer", target = "drinkManufacturer")
@Mapping(source = "countries", target = "drinkCountries")
List<DrinkDTO> drinksToDrinksDTO(List<Drink> drinks);
}
Run Code Online (Sandbox Code Playgroud)
Jak*_*ski 95
mapstruct对于那些在使用+时遇到同样问题的人lombok:
我遇到过同样的问题。原因是我Lombok也一直在使用插件。无需删除它,但您必须确保 in inpom.xml Lombok<annotationProcessorPaths>标记位于 Mapstruct 标记之前。
示例(pom.xml 文件的一部分):
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.8.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<encoding>${project.build.sourceEncoding}</encoding>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId> <!-- IMPORTANT - LOMBOK BEFORE MAPSTRUCT -->
<artifactId>lombok</artifactId>
<version>${lombok.version}</version>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
Run Code Online (Sandbox Code Playgroud)
只是为了添加@Jakub S\xc5\x82owikowski 答案,gradle 依赖项也会发生同样的情况。以下命令导致了错误:
\ndependencies { \n...\nannotationProcessor("org.mapstruct:mapstruct-processor:${mapstructVersion}")\n\nannotationProcessor("org.projectlombok:lombok:${lombokVersion}")\n...\n}\nRun Code Online (Sandbox Code Playgroud)\n因此我被迫改变顺序:
\ndependencies { \n...\nannotationProcessor("org.projectlombok:lombok:${lombokVersion}")\n \nannotationProcessor("org.mapstruct:mapstruct-processor:${mapstructVersion}")\n...\n}\nRun Code Online (Sandbox Code Playgroud)\n
该错误来自于您尝试从List<>对象映射属性,但这些属性不存在。Mapstruct 足够智能,可以在列表之间生成映射器,前提是它知道如何映射列表内的元素。
因此,您不需要@Mapping在列表到列表映射上指定注释。Mapstruct会自动使用drinkToDrinkDTO映射方法。
@Mapping(...)
DrinkDTO drinkToDrinkDTO(Drink drink);
List<DrinkDTO> drinksToDrinksDTO(List<Drink> drinks);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
36485 次 |
| 最近记录: |