繁体   English   中英

Java 8 可选 不存在值

[英]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 指针异常(十亿美元的错误)

您可以通过以下方式利用可选模式:

  1. optional.ifPresent(e-> decompress(e))

  2. optional.orElseGet (返回一个新图像)如果这是用例。

  3. optional.orElseThrow(...)例如,如果您想在数据库中不存在图像时抛出异常并以这种方式停止流程。

  4. 在 if 条件中使用optional.isPresent()来处理图像为 null 的情况。

更精确地控制您的流量

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM