【发布时间】:2022-01-05 14:47:27
【问题描述】:
我正在实现一个 API,但在我的服务层我真的不知道如何处理 Optionals 的 .get()。
@Service
public class AttributedValueService {
...
public AttributedValueDTO createAttributedValue(ActionDTO actionDTO) {
Optional<RedeemableValue> redeemableValue = redeemableValueRepository.findRedeemableValueByProductId(actionDTO.getProductId());
Optional<Value> value = valueRepository.findById(redeemableValue.get().getValue().getId());
AttributedValue attributedValue = new AttributedValue(value.get(), actionDTO.getId(), actionDTO.getUserId());
return new AttributedValueDTO(attributedValueRepository.save(attributedValue));
}
}
我的 API 接收一个对象并使用来自该对象的信息从数据库中检索一些其他对象,我想确保当 .get() 之一找不到对象时返回 ObjectNotFound。
目前我正在考虑在 find 调用中使用orElseThrow,类似这样:
@Service
public class AttributedValueService {
...
public AttributedValueDTO createAttributedValue(ActionDTO actionDTO) {
RedeemableValue redeemableValue = redeemableValueRepository.findRedeemableValueByProductId(actionDTO.getProductId())
.orElseThrow(() -> new ObjectNotFoundException("Id: "+redeemableValueDTO.getRedeemableValueId(),"Referred Redeemable Value could not be found"));
Value value = valueRepository.findById(redeemableValue.get().getValue().getId())
.orElseThrow(() -> new ObjectNotFoundException("Id: "+valueDTO.getValueId(),"Referred Value could not be found"));
AttributedValue attributedValue = new AttributedValue(value.get(), actionDTO.getId(), actionDTO.getUserId());
return new AttributedValueDTO(attributedValueRepository.save(attributedValue));
}
}
为 Spring 留下异常处理,返回 404。但是,这是正确的方法吗?
编辑:
修复了 createAttributedValue 方法的可选返回,感谢提示。
【问题讨论】:
-
没有“灵丹妙药”,不同的团队可能会以不同的方式解决这个问题。我认为您的方法没有任何本质上的错误。
-
尽管返回
Optional<AttributedValueDTO>有点误导,因为在建议的流程中没有执行会返回空的可选项。你要么返回一个实际的对象,要么抛出一个异常。 -
我宁愿使用 JSR-305
@Nullable或自定义包级别@NonnullByDefault而不是使用Optional假装存在“NPE 安全”(没有不必要的Optional框,闭包限制,完整的“可能是可选的,绝对永远不会为空,但仍然是可选的”一致性等)。
标签: java spring service optional