CRUDepository findById不返回java.util。可选的
公共接口LmsRepository扩展了CRUDepository 我没有findOne方法来获取单个计数,所以当我使用findById时,我得到了这个异常。“在[java.util.Optional]类型上找不到属性[id]”我如何解决这个问题 这是我的克鲁德雷波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
@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{
}