Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/389.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CRUDepository findById不返回java.util。可选的_Java_Spring Boot_Spring Data Jpa - Fatal编程技术网

CRUDepository findById不返回java.util。可选的

CRUDepository findById不返回java.util。可选的,java,spring-boot,spring-data-jpa,Java,Spring Boot,Spring Data Jpa,公共接口LmsRepository扩展了CRUDepository 我没有findOne方法来获取单个计数,所以当我使用findById时,我得到了这个异常。“在[java.util.Optional]类型上找不到属性[id]”我如何解决这个问题 这是我的克鲁德雷波 @Repository public interface LmsRepository extends CrudRepository<Book, Long> { } 服务文件 @Service public clas

公共接口LmsRepository扩展了CRUDepository 我没有findOne方法来获取单个计数,所以当我使用findById时,我得到了这个异常。“在[java.util.Optional]类型上找不到属性[id]”我如何解决这个问题

这是我的克鲁德雷波

@Repository
public interface LmsRepository extends CrudRepository<Book, Long> {


}
服务文件

@Service
public class LmsService {

@Autowired
private LmsRepository lmsRepository;

public Collection<Book> findAllBooks(){
    ArrayList<Book> books = new ArrayList<Book>();
    for (Book book : lmsRepository.findAll()) {
        books.add(book);
    }

    return books;
}

public void deleteBook(long id) {

    lmsRepository.deleteById(id);
}

public Optional<Book> findById(Long id) {

    return lmsRepository.findById(id);
}
}


我尝试在Crudepo中添加新方法,但它不起作用。

您可以在存储库中创建自己的方法

LmsRepository<CustomClass> extends CrudRepository<CustomClass> {
  Optional<CustomClass> findById(int id);
}
LmsRepository扩展了crudepository{
可选的findById(int-id);
}

在您的服务类中更改此

public Optional<Book> findById(Long id) {
    return lmsRepository.findById(id);
}
说明:
可选
是一个包装类,它可能包含也可能不包含非空值。出现该错误是因为您试图在模型中插入
可选的
,而不是
书本
。由于
Optional
不包含任何
id
字段,因此会出现错误
Optional
用于当您有一个不希望为null的null对象时,具有抛出异常的defalut值。例如,您可以在null optional的情况下创建自动异常抛出。例如,您可以通过以下方式升级服务:

public Book findById(Long id) {
    return lmsRepository.findById(id).orElseThrow(RuntimeException::new);
}
Book
Optional
中为空时,这将抛出
运行时异常
,或者将返回
Book
类的值

更优雅的解决方案如下所示:

public Book findById(Long id) {
    return lmsRepository.findById(id).orElseThrow(NotFoundException::new);
}
具有:

@ResponseStatus(HttpStatus.NOT_FOUND)
public class NotFoundException extends RuntimeException{
}

这样,当可选项包含一本
书时,该书将返回控制器并插入模型中。如果
可选
包含空值,则将抛出
NotFoundException
,它不需要捕获,并将映射到404 HTTP错误。

在实体中声明@Id on Id,因此findById遵循此(主键)数据类型,即存储库管理的实体的Id。

简单地说
.get()
lmsRepository.findById(id).get()之后的

.get()
解析并返回从数据库捕获的[object of lms]


不需要重写、实现等等。

请发布一些代码!SpringDataJPA支持可选的,所以当正确完成时,它应该可以工作(比如这里:)@Zülküf您能发布LmsRepository的整个接口定义吗?@dunni感谢您的帮助。要了解更多信息,请阅读以下内容:实际上,麻烦您,我无法在jsp中显示“可选”结果。我正在使用HttpServletRequest向jsp发送变量setAttribute@ZülküfADSIZ必须使用
.get()
.else
提取图书实体,然后使用提取的图书设置属性。
public Book findById(Long id) {
    return lmsRepository.findById(id).orElseThrow(RuntimeException::new);
}
public Book findById(Long id) {
    return lmsRepository.findById(id).orElseThrow(NotFoundException::new);
}
@ResponseStatus(HttpStatus.NOT_FOUND)
public class NotFoundException extends RuntimeException{
}