变量未在 Lombok Spring 的默认构造函数中初始化

问题描述 投票:0回答:2

存在一个问题变量 usersRepository 未在此类中调用的默认构造函数中初始化

@Service @RequiredArgsConstructor public class UsersDetailsService implements UserDetailsService { private final UsersRepository usersRepository; @Override public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException { Optional<User> user = usersRepository.findByEmail(username); if(user.isEmpty()) throw new UsernameNotFoundException("User not found"); return new UsersDetails(user.get()); } }
此外,我在编译程序期间对所有 Lombok 注释都存在问题。我认为某些版本有问题。 

我已经安装并更新了lombok插件,但问题仍然没有解决

这是我的

pom.xml 文件

<?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.7.14</version> <relativePath/> <!-- lookup parent from repository --> </parent> <groupId>com.example</groupId> <artifactId>CharityOrganizationSpringApp</artifactId> <version>0.0.1-SNAPSHOT</version> <name>CharityOrganizationSpringApp</name> <description>Demo project for Spring Boot</description> <properties> <java.version>17</java.version> <modelmapper.version>3.0.0</modelmapper.version> <java-jwt.version>4.4.0</java-jwt.version> <mapstruct.version>1.5.3.final</mapstruct.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-security</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.postgresql</groupId> <artifactId>postgresql</artifactId> <scope>runtime</scope> </dependency> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.modelmapper</groupId> <artifactId>modelmapper</artifactId> <version>${modelmapper.version}</version> </dependency> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>${mapstruct.version}</version> </dependency> <dependency> <groupId>com.auth0</groupId> <artifactId>java-jwt</artifactId> <version>${java-jwt.version}</version> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <configuration> <excludes> <exclude> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> </exclude> </excludes> </configuration> </plugin> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <version>3.5.1</version> <configuration> <source>16</source> <target>16</target> <annotationProcessorPaths> <path> <groupId>org.mapstruct</groupId> <artifactId>mapstruct</artifactId> <version>${mapstruct.version}</version> </path> </annotationProcessorPaths> </configuration> </plugin> </plugins> </build> </project>
    
java spring annotations lombok
2个回答
0
投票
我不确定您的措辞是否略有偏差,但是当您说“变量 usersRepository 未在默认构造函数中初始化”时,这意味着您正在通过调用空构造函数(无参数)来创建 UsersDetailsService 的实例。

如果是这种情况,那么 usersRepository 将为 null,因为它仅在从 @RequiredArgsConstructor 创建的构造函数中初始化。

如果您希望通过依赖注入自动调用从 @RequiredArgsConstructor 创建的构造函数,并且 usersRepository 仍然为 null,那么请检查您是否正在创建一个可以注入的 UsersRepository bean。如果您使用的是 JPA 存储库,则使用 @Repository 注释 UsersRepository 将实现此目的。

此外,如果您使用 JPA 存储库,请确保您的应用程序配置中有 @EnableJpaRepositories 注释,该注释指向存储库的基础包。


0
投票
我也遇到过这个。我必须将 Maven 工件 lombok-mapstruct-binding 添加到 maven-compiler-plugin,如下所示:

<plugin> <artifactId>maven-compiler-plugin</artifactId> <version>${compiler-plugin.version}</version> <configuration> <annotationProcessorPaths> <path> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>${org.mapstruct.version}</version> </path> <path> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>${lombok.version}</version> </path> <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok-mapstruct-binding</artifactId> <version>0.2.0</version> </dependency> </annotationProcessorPaths> <compilerArgs> <arg>-parameters</arg> </compilerArgs> </configuration> </plugin>
这为我解决了这个问题。我在 lombok 的 

changelog 中读到,我应该从 v1.18.16 版本(2021 年 1 月 28 日)开始就这样做。我想我只是幸运而已。

© www.soinside.com 2019 - 2024. All rights reserved.