使用Lombok注解触发NullPointerException问题求助
问题:使用Lombok注解时出现NullPointerException,依赖注入失败
我在Java代码中使用Lombok注解时遇到了NullPointerException,找不到问题根源。我甚至试过用@Autowired注解,还是没用。有没有开发者遇到过类似问题?
错误日志
2024-12-04T21:40:09.508-06:00 INFO 88219 --- [todo-management] [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Initializing Servlet 'dispatcherServlet' 2024-12-04T21:40:09.509-06:00 INFO 88219 --- [todo-management] [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet : Completed initialization in 1 ms 2024-12-04T21:40:09.854-06:00 ERROR 88219 --- [todo-management] [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: java.lang.NullPointerException: Cannot invoke "net.javaguides.todo_management.service.TodoService.addTodo(net.javaguides.todo_management.entity.Todo)" because "this.todoService" is null] with root cause java.lang.NullPointerException: Cannot invoke "net.javaguides.todo_management.service.TodoService.addTodo(net.javaguides.todo_management.entity.Todo)" because "this.todoService" is null at net.javaguides.todo_management.controller.TodoController.todoAdd(TodoController.java:19) ~[classes/:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na] at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77) ~[na:na] at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na] at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na] at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:255) ~[spring-web-6.2.0.jar:6.2.0] at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:188) ~[spring-web-6.2.0.jar:6.2.0] at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:118) ~[spring-webmvc-6.2.0.jar:6.2.0]
我的代码
控制器类
@RestController @AllArgsConstructor public class TodoController { private TodoService todoService; @PostMapping("create-todo") public ResponseEntity<Todo> todoAdd(@RequestBody Todo todo){ return new ResponseEntity<>(todoService.addTodo(todo), HttpStatus.CREATED); } }
服务接口
public interface TodoService { Todo addTodo(Todo todo); }
服务接口实现类
@Service @AllArgsConstructor public class TodoServiceImpl implements TodoService{ private TodoRepository todoRepository; public Todo addTodo(Todo todo){ return todoRepository.save(todo); } }
仓库
public interface TodoRepository extends JpaRepository<Todo,Long> { }
实体类
@Setter @Getter @AllArgsConstructor @NoArgsConstructor @Entity public class Todo { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String title; private String description; private boolean completed; }
解决方案
从错误日志来看,核心问题是TodoController中的todoService没有被Spring正确注入,导致调用时出现空指针。以下是几个排查和解决方向:
1. 确认Lombok是否正常工作
- 检查项目依赖:Maven的
pom.xml或Gradle的build.gradle中必须包含Lombok依赖,比如Maven:<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <optional>true</optional> </dependency> - IDE必须安装Lombok插件:IntelliJ/Eclipse都需要安装对应的Lombok插件,否则IDE无法识别注解,编译时不会生成构造函数、getter/setter等代码。你可以通过查看编译后的
TodoController.class文件,确认是否生成了带TodoService参数的构造函数。
2. 检查Spring组件扫描范围
- 确保你的Spring Boot主启动类(带有
@SpringBootApplication注解的类)所在的包是net.javaguides.todo_management或者其父包。如果主类在其他包下,需要手动指定扫描范围:
只有被扫描到的组件(带@SpringBootApplication(scanBasePackages = "net.javaguides.todo_management") public class TodoManagementApplication { public static void main(String[] args) { SpringApplication.run(TodoManagementApplication.class, args); } }@RestController、@Service、@Repository等注解的类)才会被Spring管理,才能进行依赖注入。
3. 确保依赖注入的正确性
- 可以尝试给
todoService字段加上final修饰符,强制构造函数注入(Lombok的@AllArgsConstructor会为final字段生成对应的构造参数):
Spring推荐使用构造函数注入,这种方式更安全,能避免空指针问题。@RestController @AllArgsConstructor public class TodoController { private final TodoService todoService; // ... 其他代码 }
4. 检查服务类的注解和实现
- 确认
TodoServiceImpl上的@Service注解没有写错,并且正确实现了TodoService接口。如果有多个TodoService的实现类,需要用@Qualifier指定具体注入哪一个,不过你的代码里只有一个实现,暂时不用考虑这个。
5. 清理缓存并重新构建项目
- 有时候编译缓存会导致Lombok注解没有正确生成代码,执行
mvn clean install(Maven)或者gradle clean build(Gradle)清理并重新构建项目,然后重启应用。
内容的提问来源于stack exchange,提问作者user3338757
相关产品推荐
相关产品推荐

