Spring Boot中MapStruct空指针异常的修复方法
修复MapStruct Mapper初始化导致的NullPointerException问题
1. 让Spring管理MapStruct Mapper实例
在UserMapper的@Mapper注解中添加componentModel = "spring"属性,MapStruct会自动生成带有@Component注解的实现类,让Spring能够扫描并注入该实例:
import org.mapstruct.Mapper; @Mapper(componentModel = "spring") public interface UserMapper { User mapUserDTOtoUser(UserDTO userDTO); UserDTO mapUsertoUserDTO(User user); }
2. 确保编译生成Mapper实现类
执行mvn clean compile命令触发注解处理器工作,编译完成后可在target/generated-sources/annotations目录下找到生成的UserMapperImpl类,确认该类带有@Component注解,说明生成正常。你的pom.xml配置已经包含了MapStruct处理器、Lombok及绑定插件,这部分无需修改。
3. 修正测试类的Mapper依赖
测试代码中需要确保UserMapper被正确Mock并注入到服务类中,避免因为Mapper实例为null导致报错:
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; import java.util.Optional; import static org.mockito.Mockito.when; import static org.junit.jupiter.api.Assertions.assertNotNull; @ExtendWith(MockitoExtension.class) public class UserServiceImplTest { @Mock private UserRepository userRepository; @Mock private UserMapper userMapper; @InjectMocks private UserServiceImpl userService; @Test public void userDtoById() { // given User user = new User(); user.setId(1L); UserDTO userDTO = new UserDTO(); userDTO.setId(1L); when(userRepository.findById(1L)).thenReturn(Optional.of(user)); when(userMapper.mapUsertoUserDTO(user)).thenReturn(userDTO); // when UserDTO result = userService.getUserById(1L); // then assertNotNull(result); } }
4. 验证组件扫描范围
如果Mapper所在包不在Spring默认扫描范围内,需要在项目启动类上添加@ComponentScan注解指定Mapper所在包路径,确保Spring能发现并初始化Mapper实例。
内容的提问来源于stack exchange,提问作者Sercan Noyan Germiyanoğlu
相关产品推荐
相关产品推荐

