javaspring-bootlombokpointcutcontroller-advice

Java object with Lombok not working inside point cut annotated classes in spring boot


I have the following DTO object used in Java spring boot code.

ExceptionResponseDTO.java

package be.bytebrain.hrms.exception;

import java.time.LocalDateTime;

import lombok.Data;

@Data
public class ExceptionResponseDTO {
    private String message;
    private LocalDateTime dateTime;
}

My global class with pointcut expression to handle exceptions thrown by spring-boot controllers.


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;
    }
}

My error when try to compile the spring boot project.

[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

Solution

  • The issue was solved by passing the Lombok plugin path to the annotation processor section in 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>
    
    

    The issue was that Lombok not being configured properly was not generating the getters and setters during compilation. That issue was fixed.