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。该问题已解决。