【问题标题】:Mongo Repository spring data giving null pointer on saving list of objectsMongo Repository spring数据在保存对象列表时给出空指针
【发布时间】:2018-11-19 08:01:04
【问题描述】:

我有一个 Spring-Boot 和 Mongo 应用程序,我试图在其中保留一个对象列表。

我有一个方法可以解析一些 json 数据并创建一个对象列表。然后我调用MongoRepositorysave 方法将其全部保存。

存储库代码如下所示:

public interface TicketRepository extends MongoRepository<Ticket, String> {

}

Ticket对象POJO是:

@Document
public class Ticket {

    @Id
    private String id;
    private String topic;
    private String type;
    private long brand;
    private long group;
    private String priority;
    private String status;
    private String created_date;
    private String created_time;
    private String channel;

    public Ticket() {
    }

    //.........getters and setters....

}

现在,某些对象的某些字段也会为空,因为我没有为它们设置任何值。

最后,这就是我保存它们的方式:

@RestController
public class TicketController {

    @Autowired
    TicketRepository ticketRepository;

    @GetMapping("/tickets")
    public void saveTicketData() {
        List<Ticket> tickets = null;
        try {
            tickets = getTicketObjectList(ticketJson);
            ticketRepository.save(tickets);
        } catch (DuplicateKeyException e) {
            System.out.println("duplicate found!");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}

这会在保存方法调用时抛出NullPointerExcetion,而无需任何进一步的堆栈跟踪。

可能是什么原因?

【问题讨论】:

  • 接口应该用@Repository注解
  • 我找到了解决方案。实际上,TicketRepository bean 并没有以某种方式自动装配。
  • @roger_that :嘿,我也面临同样的问题。你能告诉我你是怎么解决的吗?

标签: java mongodb spring-boot spring-data-mongodb


【解决方案1】:

我认为自动装配的问题不在@Repository 甚至在EnableJpaRepositories 中。根据这个答案

Spring data repository works without annotations 您不需要提及注释,因为它是起点自动配置,像这样自动装配

@Autowired
TicketRepository ticketRepository;

//getter and setter 

【讨论】:

  • 我相信这不是强制性的!!你也可以使用@EnableJpaRepositories(basePackages="org.my.pkg")
  • @EnableJpaRepositories 仅用于对不同包的组件扫描(不同的包意味着这些包不在包含您的起点 main 方法的同一包下),但存储库或控制器或组件或服务正在标记将从 this 中创建,因此在我们的例子中,我应该为此添加注释以使创建对象可用
  • 我找到了解决方案。实际上,TicketRepository bean 并没有以某种方式自动装配。无论有没有注释,它都可以工作。
  • @roger_that 你怎么能在不创建这个对象的情况下使用它的对象??
【解决方案2】:

您是否尝试过在调试中运行应用程序,并在调用ticketRepository.save(tickets) 时中断?

票证List 可能为空。您还没有展示getTicketObjectList 方法的作用,但它可能返回一个空对象,而不是实际的List。因此,NPE 可能是因为您试图保存空值。

或者,ticketRepository 可能为 null,并且没有正确自动连接,但我认为如果是这种情况,当应用程序启动时你会遇到 spring 异常。

【讨论】:

  • 我找到了解决方案。实际上,TicketRepository bean 并没有以某种方式自动装配。
猜你喜欢
  • 1970-01-01
  • 2016-05-03
  • 1970-01-01
  • 1970-01-01
  • 2012-11-20
  • 2016-09-11
  • 2018-07-05
  • 1970-01-01
  • 2021-08-31
相关资源
最近更新 更多