java - UserService NullPointerException Spring/Hibernate

标签 java spring hibernate nullpointerexception

我有一个使用 Spring/Hibernate 的 Maven 项目,并且在 this.userService.save(user); 处不断收到 NullPointerException。 UserService 是 @Autowired,所以我不确定为什么这会抛出 NPE。 UserService 的代码示例:

@Component
public class BotService extends TelegramLongPollingBot {

    @Autowired
    private UserService userService;

    @Autowired
    private MessagesService messagesService;

    @Override
    public void onUpdateReceived(Update update) {
        Message message = update.getMessage();
        String text = message.getText();
        User user = new User();
        user.setTelegramId(message.getFrom().getId());
        user.setFirstName(message.getFrom().getFirstName());
        user.setLastName(message.getFrom().getLastName());
        Messages messages = new Messages();
        messages.setUser(user);
        messages.setId(user.getId());
        messages.setText(text);
        this.userService.save(user); // <-- NPE 
        }
    }

UserRepository.java

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import com.example.model.User;

@Repository
public interface UserRepository extends JpaRepository<User, Long>{
    User findById(int id);
}

UserService.java

import com.example.model.User;

public interface UserService {
    public User findById(int id);
    public void save(User user);
}

UserServiceImpl.java

import javax.transaction.Transactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.example.model.User;
import com.example.repository.UserRepository;

@Service("userService")
public class UserServiceImpl implements UserService{

    @Autowired
    private UserRepository userRepository;

    @Override
    @Transactional
    public void save(User user) {
        userRepository.save(user);
    }

    @Override
    public User findById(int id) {
        return userRepository.findById(id);
    }
}

UPD。添加了详细说明

BotExampleApplication.java:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.telegram.telegrambots.ApiContextInitializer;
import org.telegram.telegrambots.TelegramBotsApi;
import org.telegram.telegrambots.exceptions.TelegramApiException;
import org.telegram.telegrambots.starter.EnableTelegramBots;

import com.example.service.BotService;

@SpringBootApplication
@EnableTelegramBots
@EnableTransactionManagement
public class BotExampleApplication {

    public static void main(String[] args) {
        ApiContextInitializer.init();

        TelegramBotsApi botsApi = new TelegramBotsApi();

        try {
            botsApi.registerBot(new BotService());
        } catch (TelegramApiException e) {
            e.printStackTrace();
        }
        SpringApplication.run(BotExampleApplication.class, args);
    }
}

堆栈跟踪:

java.lang.NullPointerException: null
    at com.example.service.BotService.onUpdateReceived(BotService.java:46) ~[classes/:na]
    at java.base/java.util.ArrayList.forEach(ArrayList.java:1380) ~[na:na]
    at org.telegram.telegrambots.generics.LongPollingBot.onUpdatesReceived(LongPollingBot.java:27) ~[telegrambots-meta-3.6.1.jar:na]
    at org.telegram.telegrambots.updatesreceivers.DefaultBotSession$HandlerThread.run(DefaultBotSession.java:309) ~[telegrambots-3.6.1.jar:na]

Package structure

有什么建议吗?

最佳答案

您永远不应该创建 Spring 组件的新实例。在您的主类中,BotService 是使用new 创建的。这与 spring 创建的 BotService 实例不同。 @Autowired 仅适用于 Spring 组件,并且由于您使用的是不同的实例,因此依赖项永远不会注入(inject)其中。

要使其正常工作,请从 spring 上下文中获取 BotService 实例,然后使用它进行注册。

ConfigurableApplicationContext context = SpringApplication.run(...);
BotService service = context.getBean(BotService.class);

关于java - UserService NullPointerException Spring/Hibernate,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50783771/

相关文章:

java - java中的二进制编辑

java - 尝试通过从底层浏览器构建的代理通过 https 隧道永远不会响应?

java - 在 spring Boot 中使用 Dao 设计模式,而不是使用 spring data jpa 提供的存储库设计模式,这是一个好主意吗?

java - 如何使用 Spring RestTemplate 代替 Apache Httpclient?

java - tomcat 中的 Spring Boot war 无法正常工作

java - Hibernate - 使用 net.ucanaccess.jdbc.UcanaccessDriver 时出现 org.hibernate.MappingException

java - Tomcat 7 Liferay 6.2 关于损坏数据库的奇怪错误

java - 如何更新启用 NETCONF 的设备上的配置?

java - 仅将 Map 或映射文件与 Hibernate 一起使用

java - Hibernate 使用条件删除