当前位置: 首页 > 知识库问答 >
问题:

JAVA由于“Map”导致的lang.NullPointerException可能不包含“Path”类型的键

齐威
2023-03-14

我在springboot项目中遇到了一个问题,我试图检索使用jpa规范实时处理的“票据”的统计信息。根据目的,车票有一定的处理天数。

以下是错误:

java.lang.NullPointerException: null
    at com.ticketcorp.ticket.repository.TicketSpecification.lambda$isOntime$c9c337fb$1(TicketSpecification.java:208) ~[classes/:na]

我相信这是意料之中的,因为我在同一条线上得到了这个警告:

'Map<String, Integer>' may not contain keys of type 'Path<String>' 

这是我的门票实体:

@Table(name = "tickets")
public class Ticket {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int id;
    private String code;
    private String purpose;
    @Lob
    @Column(columnDefinition = "TEXT")
    private String content;
    @Lob
    @Column(columnDefinition = "TEXT")
    private String solution;
    @Lob
    @Column(columnDefinition = "TEXT")
    private String comment;
    private int status;
    private LocalDateTime createdAt= LocalDateTime.now();
    private LocalDateTime handledAt= LocalDateTime.now();
}

这是我的机票规格:

    public class TicketSpecification {
    public static Specification<Ticket> isOntime(ArrayList<Purpose> purposes) {
           
       return (root, query, builder) -> {
        /*Example of content for nameAndDurationMap: {Suggestion=25, Bug report=1}*/
        Map<String, Integer> nameAndDurationMap = PurposeUtils.PurposeArrayToNameDurationMap(purposes);
                
                return builder.le(
                        builder.diff(
                                builder.function("unix_timestamp", Long.class, root.get(Ticket_.handledAt)),
                                builder.function("unix_timestamp", Long.class, root.get(Ticket_.createdAt))
                        )
                        , nameAndDurationMap.get(root.get(Ticket_.purpose)) * 86400);/*Line 208*/
    
            };
        }
    }

这是我的售票服务:

@Service
public class TicketService {
    @Autowired
    private TicketRepository ticketRepository;

public String countTicketsHandledOnTime(){
    int handledStatus=2;

    Specification<Ticket> allTicketHandledOnTimeQuery =where(TicketSpecification.isHandled(handledStatus)).and(TicketSpecification.isOntime(purposes));

return String.valueOf(ticketRepository.count(allTicketHandledOntimeQuery));
}

}

以下是POJO模型的目的:

public class Purpose{
    private String id;
    private String name;
    private String description;
    private int level;
    private int duration;
}

这里是PurposeUtils:它需要一个目的列表,并生成一个目的哈希图,以及处理该目的的票据所需的天数。

public class PurposeUtils {
    public static Map<String, Integer> PurposeArrayToNameDurationMap(ArrayList<Purpose> purposes) {
        Map<String, Integer> purposeMap = new HashMap<String, Integer>();
        for(Purpose purpose: purposes) {
            purposeMap.put(purpose.getName(), purpose.getDuration());
        }
        return purposeMap;
    }
}

共有1个答案

章茂
2023-03-14

我假设您使用javax.persistence.criteria.Root在这一行中:

nameAndDurationMap.get(root.get(Ticket_.purpose)) * 86400);/*Line 208*/

注意留档的根:

路径

因此,你要求地图获取确实不存在的值

请注意,root不是值持有人,它是prdicat创建的值,因此在您的预测中,您将说我希望值X(root)满足Y条件

这将成为SQL查询,所以它必须是SQL可以处理的值,你的代码不会在每一张票上被调用...如果你想这样做,要么让它迭代每一个目的

    (
    if purpose_x == Ticket_.purpose and le(...)
    or purpose_y == Ticket_.purpose and le(...)
    )

或者将逻辑移到可以调用的DB函数

给出想法但可能不会运行的代码:

public class TicketSpecification {


public static Specification<Ticket> isOntime(ArrayList<Purpose> purposes){
    return (root, query, builder) -> {
        List<Predicate> predicates = new ArrayList<>();
    
        for(Purpose purpose: purposes) {
            predicates.add(isOntime(purpose.getName(), purpose.getDuration(),root, query, builder);
        }
    
        return builder.or(predicates.toArray(new Predicate[0]));
    }
}
public static Predicate isOntime(String purposes_name,int purposes_time,Root<Ticket> root, CriteriaQuery<?> query, CriteriaBuilder builder) {      
            return builder.and(
                builder.equal(root.get(Ticket_.purpose),purposes_name)
                ,
                builder.le(
                    builder.diff(
                            builder.function("unix_timestamp", Long.class, root.get(Ticket_.handledAt)),
                            builder.function("unix_timestamp", Long.class, root.get(Ticket_.createdAt))
                    )
                    ,(purposes_time * 86400);/*Line 208*/
                    )
            );
        }

}
 类似资料:
  • 我已经编写了在android studio上显示可扩展列表视图的代码。以下是ExplandableListView的代码: 这是执行操作的方法: 它在函数定义中的“groupPosition”处显示警告: 当鼠标悬停在上面时,会显示

  • 假设我有一张地图: “Assert类型中的方法assertThat(T,Matcher)不适用于参数(Map,Matcher>>>)” (以上是这里的解决方案:Hamcrest比较集合)

  • 我遇到了一个奇怪的例外 '_InternalLinkedHashMap 我不知道怎么画地图 第一次运行代码时,它可以正常工作,因为它可以访问else部分。当它第二次应该访问第一个部件时,它会产生上述异常。 } 输出 FoodLog输出: {2021年8月3日:{早餐:{鱼片:{碳水化合物:0.0,脂肪:1.7,蛋白质:20.08,钙:95}},晚餐:{},零食:{},午餐:{} E/flatter

  • 问题内容: 我正在尝试使用此Golang Yelp API软件包。在某些结构中,它使用guregu的null包中定义的类型。 我想声明一个在Yelp API包中定义的结构,其中的某些字段作为值使用(即,该结构,我正在尝试使用)。因此,在我的程序中,我同时导入了Yelp API包和guregu的null包,并尝试使用ip.Lat和ip.Lat为float64s声明该结构。(定义): 但是当我运行该程

  • NullPointerException且未连接适配器;每次我在GennMotion上测试此应用程序时,都会跳过布局。我读过与同一问题相关的其他问题,但没有任何帮助。 logcat 09-20 13:21:13.7384658-4658/com。实例基兰。detailapp E/AndroidRuntime:致命异常:主进程:com。实例基兰。detailapp,PID:4658 java。lan

  • 我有一个使用Maven构建和管理依赖关系的Camel项目。我的项目依赖于Camel组件版本2.14.0。我已经将Spring依赖项与Camel匹配,并使用Spring组件版本3.2.11。但是,如果我将camel-test-spring版本2.14.0作为依赖项包含在测试范围中,它会将spring-beans版本4.0.7.release和spring-expression 4.0.7.relea