[英]Java 8 optional No value present
我已经制作了这个 function 并使用了可选的,尽管我的图像没有被返回并且抛出错误 NO VALUE PRESENT 即使我的数据库(MySQL)存储了带有名称的数据
@GetMapping(path = { "/get/{imageName}" })
public ImageModel getImage(@PathVariable("imageName") String imageName) throws IOException {
final Optional<ImageModel> retrievedImage = imageRepository.findByName(imageName);
ImageModel img = new ImageModel(retrievedImage.get().getName(), retrievedImage.get().getType(),
decompressBytes(retrievedImage.get().getPic()));
return img;
}
这是我的刀 class
public interface ImageRepository extends JpaRepository<ImageModel, Long> {
Optional<ImageModel> findByName(String name);
Optional<ImageModel> findById(Long id);
}
这是我的 model class 我在其中定义了 mysql 数据库
@Entity
@Table(name = "image_table")
public class ImageModel {
public ImageModel() {
super();
}
public ImageModel(String name, String type, byte[] pic) {
this.name = name;
this.type = type;
this.pic = pic;
}
@Id
@Column(name = "id")
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name")
private String name;
//image bytes can have large lengths so we specify a value
//which is more than the default length for picByte column
@Column(name = "pic", length = 1000)
private byte[] pic;
@Column(name = "type")
private String type;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getType() {
return type;
}
public void setType(String type) {
this.type = type;
}
public byte[] getPic() {
return pic;
}
public void setPic(byte[] pic) {
this.pic = pic;
}
}
提示在名称中。 Optional
的 object 指的是不一定必须存在的东西。 如果Optional
的实例不存在,您需要告诉应用程序该怎么做:
final Optional<ImageModel> retrievedImage = imageRepository.findByName(imageName);
return retrievedImage.get().orElse(null);
WRT 您的数据查询没有返回您要查找的内容,我会说这是一个单独的问题,并且您提供的代码没有详细说明数据库的查询。
可选模式(也是 monad)让您可以控制数据是否存在,这可以帮助您避免 null 指针异常(十亿美元的错误)
您可以通过以下方式利用可选模式:
optional.ifPresent(e-> decompress(e))
optional.orElseGet
(返回一个新图像)如果这是用例。
optional.orElseThrow(...)
例如,如果您想在数据库中不存在图像时抛出异常并以这种方式停止流程。
在 if 条件中使用optional.isPresent()
来处理图像为 null 的情况。
更精确地控制您的流量
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.