Java 带 Lombok 的对象在 spring 引导中注释 类 的切点内部不工作
Java object with Lombok not working inside point cut annotated classes in spring boot
我在 Java spring 引导代码中使用了以下 DTO 对象。
ExceptionResponseDTO.java
package be.bytebrain.hrms.exception;
import java.time.LocalDateTime;
import lombok.Data;
@Data
public class ExceptionResponseDTO {
private String message;
private LocalDateTime dateTime;
}
我的全局 class 带有切入点表达式来处理 spring-boot 控制器抛出的异常。
package be.bytebrain.hrms.exception;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.context.request.WebRequest;
@RestControllerAdvice
public class GlobalExceptionHandler {
@ResponseStatus(HttpStatus.NOT_FOUND)
@ExceptionHandler(NotFoundException.class)
public ResponseEntity<Object> handleExceptions(NotFoundException exception, WebRequest webRequest) {
var response = new ExceptionResponseDTO();
response.setDateTime(LocalDateTime.now());
response.setMessage(exception.getMessage());
return new ResponseEntity<>(response, HttpStatus.NOT_FOUND);
}
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(MethodArgumentNotValidException.class)
public Map<String, String> handleValidationExceptions(MethodArgumentNotValidException ex) {
Map<String, String> errors = new HashMap<>();
ex.getBindingResult().getAllErrors().forEach((error) -> {
String fieldName = ((FieldError) error).getField();
String errorMessage = error.getDefaultMessage();
errors.put(fieldName, errorMessage);
});
return errors;
}
}
我在尝试编译 spring 引导项目时出错。
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] /Users/naveenvignesh/Projects/hrms/hrms-api/src/main/java/be/bytebrain/hrms/exception/GlobalExceptionHandler.java:[24,25] cannot find symbol
symbol: method setDateTime(java.time.LocalDateTime)
location: variable response of type be.bytebrain.hrms.exception.ExceptionResponseDTO
[ERROR] /Users/naveenvignesh/Projects/hrms/hrms-api/src/main/java/be/bytebrain/hrms/exception/GlobalExceptionHandler.java:[25,25] cannot find symbol
symbol: method setMessage(java.lang.String)
location: variable response of type be.bytebrain.hrms.exception.ExceptionResponseDTO
[INFO] 2 errors
[INFO] -------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 8.712 s
[INFO] Finished at: 2021-05-25T18:05:40+05:30
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project be.bytebrain.hrms: Compilation failure: Compilation failure:
[ERROR] /Users/naveenvignesh/Projects/hrms/hrms-api/src/main/java/be/bytebrain/hrms/exception/GlobalExceptionHandler.java:[24,25] cannot find symbol
[ERROR] symbol: method setDateTime(java.time.LocalDateTime)
[ERROR] location: variable response of type be.bytebrain.hrms.exception.ExceptionResponseDTO
[ERROR] /Users/naveenvignesh/Projects/hrms/hrms-api/src/main/java/be/bytebrain/hrms/exception/GlobalExceptionHandler.java:[25,25] cannot find symbol
[ERROR] symbol: method setMessage(java.lang.String)
[ERROR] location: variable response of type be.bytebrain.hrms.exception.ExceptionResponseDTO
[ERROR] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
通过将 Lombok 插件路径传递到 maven 中的注释处理器部分解决了该问题。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.5</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>be.bytebrain</groupId>
<artifactId>be.bytebrain.hrms</artifactId>
<version>1.0.0</version>
<name>hrms-api</name>
<description>HRMS API backend code based on spring boot</description>
<properties>
<java.version>11</java.version>
<org.mapstruct.version>1.4.2.Final</org.mapstruct.version>
<org.projectlombok.version>1.18.20</org.projectlombok.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-ui</artifactId>
<version>1.5.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${org.projectlombok.version}</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>3.1.2</version>
<configuration>
<sourceDirectories>
<sourceDirectory>src/main/java</sourceDirectory>
</sourceDirectories>
<configLocation>checkstyle.xml</configLocation>
<propertiesLocation>checkstyle_maven.properties</propertiesLocation>
<encoding>UTF-8</encoding>
<logViolationsToConsole>true</logViolationsToConsole>
<failOnViolation>false</failOnViolation>
<failsOnError>false</failsOnError>
</configuration>
<dependencies>
<dependency>
<groupId>com.puppycrawl.tools</groupId>
<artifactId>checkstyle</artifactId>
<version>8.42</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>validate</id>
<phase>validate</phase>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
<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>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</path>
<!-- other annotation processors -->
<!-- The below code was missing -->
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${org.projectlombok.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
</project>
问题是没有正确配置的 Lombok 在编译期间没有生成 getter 和 setter。该问题已解决。
我在 Java spring 引导代码中使用了以下 DTO 对象。
ExceptionResponseDTO.java
package be.bytebrain.hrms.exception;
import java.time.LocalDateTime;
import lombok.Data;
@Data
public class ExceptionResponseDTO {
private String message;
private LocalDateTime dateTime;
}
我的全局 class 带有切入点表达式来处理 spring-boot 控制器抛出的异常。
package be.bytebrain.hrms.exception;
import java.time.LocalDateTime;
import java.util.HashMap;
import java.util.Map;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.FieldError;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.context.request.WebRequest;
@RestControllerAdvice
public class GlobalExceptionHandler {
@ResponseStatus(HttpStatus.NOT_FOUND)
@ExceptionHandler(NotFoundException.class)
public ResponseEntity<Object> handleExceptions(NotFoundException exception, WebRequest webRequest) {
var response = new ExceptionResponseDTO();
response.setDateTime(LocalDateTime.now());
response.setMessage(exception.getMessage());
return new ResponseEntity<>(response, HttpStatus.NOT_FOUND);
}
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(MethodArgumentNotValidException.class)
public Map<String, String> handleValidationExceptions(MethodArgumentNotValidException ex) {
Map<String, String> errors = new HashMap<>();
ex.getBindingResult().getAllErrors().forEach((error) -> {
String fieldName = ((FieldError) error).getField();
String errorMessage = error.getDefaultMessage();
errors.put(fieldName, errorMessage);
});
return errors;
}
}
我在尝试编译 spring 引导项目时出错。
[ERROR] COMPILATION ERROR :
[INFO] -------------------------------------------------------------
[ERROR] /Users/naveenvignesh/Projects/hrms/hrms-api/src/main/java/be/bytebrain/hrms/exception/GlobalExceptionHandler.java:[24,25] cannot find symbol
symbol: method setDateTime(java.time.LocalDateTime)
location: variable response of type be.bytebrain.hrms.exception.ExceptionResponseDTO
[ERROR] /Users/naveenvignesh/Projects/hrms/hrms-api/src/main/java/be/bytebrain/hrms/exception/GlobalExceptionHandler.java:[25,25] cannot find symbol
symbol: method setMessage(java.lang.String)
location: variable response of type be.bytebrain.hrms.exception.ExceptionResponseDTO
[INFO] 2 errors
[INFO] -------------------------------------------------------------
[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 8.712 s
[INFO] Finished at: 2021-05-25T18:05:40+05:30
[INFO] ------------------------------------------------------------------------
[ERROR] Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project be.bytebrain.hrms: Compilation failure: Compilation failure:
[ERROR] /Users/naveenvignesh/Projects/hrms/hrms-api/src/main/java/be/bytebrain/hrms/exception/GlobalExceptionHandler.java:[24,25] cannot find symbol
[ERROR] symbol: method setDateTime(java.time.LocalDateTime)
[ERROR] location: variable response of type be.bytebrain.hrms.exception.ExceptionResponseDTO
[ERROR] /Users/naveenvignesh/Projects/hrms/hrms-api/src/main/java/be/bytebrain/hrms/exception/GlobalExceptionHandler.java:[25,25] cannot find symbol
[ERROR] symbol: method setMessage(java.lang.String)
[ERROR] location: variable response of type be.bytebrain.hrms.exception.ExceptionResponseDTO
[ERROR] -> [Help 1]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/MojoFailureException
通过将 Lombok 插件路径传递到 maven 中的注释处理器部分解决了该问题。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.5</version>
<relativePath /> <!-- lookup parent from repository -->
</parent>
<groupId>be.bytebrain</groupId>
<artifactId>be.bytebrain.hrms</artifactId>
<version>1.0.0</version>
<name>hrms-api</name>
<description>HRMS API backend code based on spring boot</description>
<properties>
<java.version>11</java.version>
<org.mapstruct.version>1.4.2.Final</org.mapstruct.version>
<org.projectlombok.version>1.18.20</org.projectlombok.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.liquibase</groupId>
<artifactId>liquibase-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<scope>runtime</scope>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-ui</artifactId>
<version>1.5.2</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${org.projectlombok.version}</version>
</dependency>
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
<version>${org.mapstruct.version}</version>
</dependency>
<dependency>
<groupId>javax.inject</groupId>
<artifactId>javax.inject</artifactId>
<version>1</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-checkstyle-plugin</artifactId>
<version>3.1.2</version>
<configuration>
<sourceDirectories>
<sourceDirectory>src/main/java</sourceDirectory>
</sourceDirectories>
<configLocation>checkstyle.xml</configLocation>
<propertiesLocation>checkstyle_maven.properties</propertiesLocation>
<encoding>UTF-8</encoding>
<logViolationsToConsole>true</logViolationsToConsole>
<failOnViolation>false</failOnViolation>
<failsOnError>false</failsOnError>
</configuration>
<dependencies>
<dependency>
<groupId>com.puppycrawl.tools</groupId>
<artifactId>checkstyle</artifactId>
<version>8.42</version>
</dependency>
</dependencies>
<executions>
<execution>
<id>validate</id>
<phase>validate</phase>
<goals>
<goal>check</goal>
</goals>
</execution>
</executions>
</plugin>
<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>
<annotationProcessorPaths>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>${org.mapstruct.version}</version>
</path>
<!-- other annotation processors -->
<!-- The below code was missing -->
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>${org.projectlombok.version}</version>
</path>
</annotationProcessorPaths>
</configuration>
</plugin>
</plugins>
</build>
</project>
问题是没有正确配置的 Lombok 在编译期间没有生成 getter 和 setter。该问题已解决。