Va por debajo de código alguna vez nullPointerException
a menos e.getKey()
retornosnull
Map<Integer, Optional<SecurityAttributeChange>> spnCreationDetails;
Optional.ofNullable(spnCreationDetails.get(e.getKey()).orElse(new SecurityAttributeChange()).getNewAttribute())
.orElse(new SecurityAttr())
.getUserName());
Me estoy haciendo NPE en esta línea, hay alguna forma de depurar este? Sé que spnCreationDetails.get(e.getKey())
devuelve un valor nulo, me estoy perdiendo algo en el manejo de null
aquí?
- EDITAR
Aquí está el método casi completa que ayudará a dar su opinión sobre cómo refactorizar esto para que sea legible.
private void updateAuditFields(List<SecurityAttributeChange> securityChanges, Map<Integer, Map<String, Object>> result) {
Map<Integer, Optional<SecurityAttributeChange>> spnModificationDetails = ...
Map<Integer, Optional<SecurityAttributeChange>> spnCreationDetails = ...
result.entrySet().stream().forEach(e -> {
e.getValue()
.put("userIdLastChanged",
Optional.ofNullable(Optional.ofNullable(spnModificationDetails.get(e.getKey()))
.orElse(Optional.of(new SecurityAttributeChange()))
.get()
.getNewAttribute()).orElse(new SecurityAttr()).getUserName());
e.getValue()
.put("lastChangedDatetime",
Optional.ofNullable(Optional.ofNullable(spnModificationDetails.get(e.getKey()))
.orElse(Optional.of(new SecurityAttributeChange()))
.get()
.getNewAttribute()).orElse(new SecurityAttr()).getKnowledgeBeginDate());
e.getValue()
.put("userIdCreated", Optional.ofNullable(
Optional.ofNullable(spnCreationDetails.get(e.getKey())).orElse(Optional.of(new SecurityAttributeChange())).get().getNewAttribute())
.orElse(new SecurityAttr())
.getUserName());
e.getValue()
.put("createdDatetime",
Optional.ofNullable(Optional.ofNullable(spnCreationDetails.get(e.getKey()))
.orElse(Optional.of(new SecurityAttributeChange()))
.get()
.getNewAttribute()).orElse(new SecurityAttr()).getKnowledgeBeginDate());
});
}
Si spnCreationDetails.get(e.getKey())
puede ser nulo, es probable que tenga:
Optional.ofNullable(spnCreationDetails.get(e.getKey()))
.orElse(new SecurityAttributeChange())
.getNewAttribute()
.orElse(new SecurityAttr())
.getUserName();
es decir, spnCreationDetails.get(e.getKey())
debe ser envuelto con un Optional
.
EDIT: Al ver su comentario, spnCreationDetails.get(e.getKey())
pueden regresar ya sea un null
o un Optional<SecurityAttributeChange>
, por lo que sería mejor para transformar sólo el null
en una nueva Optional
:
spnCreationDetails.getOrDefault(e.getKey(),Optional.empty())
.orElse(new SecurityAttributeChange())
.getNewAttribute()
.orElse(new SecurityAttr())
.getUserName();