NullPointerException 在尝试保存到数据库时使用 Spring Boot JPA

NullPointerException using Spring Boot JPA when trying to save to database

我打算尝试一些交易数据,并请求检索一些我希望存储在 mysql 中的市场数据。

从昨天开始,我的代码一直卡在 NullPointerException 上。例如,在 Whosebug 上,我经常看到尝试实例化服务或忘记注释的错误。

对我来说,每当我尝试使用 Autowired 服务时,它似乎都会出错。我现在从 main 方法调用方法(在 Controller 中发出数据请求)。这确实意味着我必须实例化才能到达那里。这可能是它出错的地方。我可能缺少如何正确处理这个问题或如何将我的数据保存到 DAO 的概念。希望有人能指引我正确的方向。

查看下面的代码:

@SpringBootApplication
public class DesktopAutoTradingApplication {


    public static void main(String[] args) throws JsonProcessingException {

        SpringApplication.run(DesktopAutoTradingApplication.class, args);
        MarketsBinanceController marketsBinanceController = new MarketsBinanceController();
        marketsBinanceController.saveListOfMarketsBinance();
    }
@Controller
public class MarketsBinanceController{

    @Autowired
    RequestServices requestService;

    public void saveListOfMarketsBinance() throws JsonProcessingException {
        String resourceURL;
        RestTemplate restTemplate = new RestTemplate();
        ObjectMapper mapper = new ObjectMapper();
        ResponseEntity<String> response;
        MarketsBinance marketsBinance;

        resourceURL = "https://api.cryptowat.ch/markets/binance";
        response = restTemplate.getForEntity(resourceURL, String.class);
        JsonNode root = mapper.readTree(response.getBody());
        JsonNode result = root.get("result");
        System.out.println(result);
        List<MarketsBinance> markets = new ArrayList<>();
        for(JsonNode item : result){
            marketsBinance = new MarketsBinance();
            MarketsBinanceDto marketsBinanceDto;
            marketsBinanceDto = mapper.treeToValue(item,MarketsBinanceDto.class);
            marketsBinance.setId(marketsBinanceDto.getId());
            marketsBinance.setExchange(marketsBinanceDto.getExchange());
            marketsBinance.setPair(marketsBinanceDto.getPair());
            marketsBinance.setActive(marketsBinanceDto.getActive());
            marketsBinance.setRoute(marketsBinanceDto.getRoute());
            markets.add(marketsBinance);
            requestService.saveMarketsBinance(markets);
        }
    }
}
@Service
@Transactional
public class RequestServices {

    @Autowired
    private MarketsBinanceDAO marketsBinanceDAO;

    public void saveMarketsBinance(List<MarketsBinance> markets){
        marketsBinanceDAO.saveAll(markets);
    }
}
@Component
public interface MarketsBinanceDAO extends CrudRepository<MarketsBinance, Long> {

}
@Entity
public class MarketsBinance {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long tableId;
    private Long id;
    private String exchange;
    private String pair;
    private Boolean active;
    private String route;

//getters and setters

public class MarketsBinanceDto {

    private Long id;
    private String exchange;
    private String pair;
    private Boolean active;
    private String route;

//getters and setters
Exception in thread "main" java.lang.NullPointerException
    at Controller.MarketsBinanceController.saveListOfMarketsBinance(MarketsBinanceController.java:46)
    at com.DAT.DesktopAutoTrading.DesktopAutoTradingApplication.main(DesktopAutoTradingApplication.java:16)

下面是 运行 程序在第一个答案中添加建议的解决方案时收到的错误消息。

Exception in thread "main" org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'Controller.MarketsBinanceController' available
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:352)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.getBean(DefaultListableBeanFactory.java:343)
    at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1127)
    at com.DAT.DesktopAutoTrading.DesktopAutoTradingApplication.main(DesktopAutoTradingApplication.java:15)
2020-09-07 12:24:03.545  INFO 22756 --- [         task-1] o.h.e.t.j.p.i.JtaPlatformInitiator       : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform]
2020-09-07 12:24:03.553  INFO 22756 --- [         task-1] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default'

您应该使用 Spring 创建和配置的 MarketsBinanceController 类型的 bean,而不是 MarketsBinanceController marketsBinanceController = new MarketsBinanceController();
要在 main 方法中获取此 bean,您应该获取 ApplicationContextApplicationContext 您可以从 SpringApplication.run(DesktopAutoTradingApplication.class, args); 获取返回对象。
完整代码示例:

ConfigurableApplicationContext context = SpringApplication.run(DesktopAutoTradingApplication.class, args);
MarketsBinanceController marketsBinanceController = context.getBean(MarketsBinanceController.class);
marketsBinanceController.saveListOfMarketsBinance();