You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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字段生成对应的构造参数):
    @RestController
    @AllArgsConstructor
    public class TodoController {
    
        private final TodoService todoService;
        // ... 其他代码
    }
    
    Spring推荐使用构造函数注入,这种方式更安全,能避免空指针问题。

4. 检查服务类的注解和实现

  • 确认TodoServiceImpl上的@Service注解没有写错,并且正确实现了TodoService接口。如果有多个TodoService的实现类,需要用@Qualifier指定具体注入哪一个,不过你的代码里只有一个实现,暂时不用考虑这个。

5. 清理缓存并重新构建项目

  • 有时候编译缓存会导致Lombok注解没有正确生成代码,执行mvn clean install(Maven)或者gradle clean build(Gradle)清理并重新构建项目,然后重启应用。

内容的提问来源于stack exchange,提问作者user3338757

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 18:24:51