java - CrudRepository findById 不返回 java.util。选修的

标签 java spring-boot spring-data-jpa

公共(public)接口(interface) LmsRepository 扩展了 CrudRepository 我没有用于获取单个计数的 findOne 方法,因此当我使用 findById 时,出现此异常。“在类型 [java.util.Optional] 上找不到属性 [id]”我该如何解决此问题?

这是我的 CrudRepo

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


}

实体文件

@Entity(name="lms_tbl")
public class Book {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;

@Column(name="book_name")
private String bookName;

private String author;

@Column(name="purchase_date")
@Temporal(TemporalType.DATE)
private Date purchaseDate;

public long getId() {
    return id;
}

public void setId(long id) {
    this.id = id;
}

and other....

服务文件

@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);
}

}

Controller 文件

@Controller
public class MainController {

@Autowired
private LmsService lmsService;


@GetMapping("/")
public String index(HttpServletRequest req) {
    req.setAttribute("books", lmsService.findAllBooks());
    req.setAttribute("mode","BOOK_VIEW");
    return "index";
}

@GetMapping("/updateBook")
public String index(@RequestParam Long id,HttpServletRequest req) {
    req.setAttribute("book", lmsService.findById(id));
    req.setAttribute("mode","BOOK_EDIT");
    return "index";
}

}

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

最佳答案

在您的服务类中更改此内容

public Optional<Book> findById(Long id) {
    return lmsRepository.findById(id);
}

到此

public Book findById(Long id) {
    return lmsRepository.findById(id).get();
}

说明:Optional 是一个包装类,可能包含也可能不包含非空值。您收到该错误是因为您尝试在模型中插入 Optional,而不是 Book。由于 Optional 不包含任何 id 字段,因此您会收到错误。 Optional 用于当您有一个 null 对象但您不希望它为 null 时,具有抛出异常的默认值。例如,您可以创建一个在可选 null 的情况下自动抛出异常的例子。例如,您可以通过以下方式升级您的服务:

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

只要 Optional 中的 Book 为 null,就会抛出 RuntimeException,或者返回 的值预订类(class)。

更优雅的解决方案如下:

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

有:

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

通过这种方式,当可选包含一个 Book 时,它会返回到 Controller 并插入到模型中。如果 Optional 包含 null 值,则将抛出 NotFoundException,它不需要被捕获,并且将映射为 404 HTTP 错误。

关于java - CrudRepository findById 不返回 java.util。选修的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51747549/

相关文章:

postgresql - jdbcTemplate 连接泄漏到 Spring Boot 中的 postgresql 数据库

java - 无法延迟初始化角色 : User. 权限的集合,无法初始化代理 - 无 session

spring - hibernate 中带有 onetomany 注释的 org.hibernate.exception.ConstraintViolationException

java - 应用 Maven groupId 命名约定

java - 在 Hibernate 中处理环境特定字段的最佳方法

java - Android Studio - 未找到 JVM 安装

java - 如何在 spring boot 中禁用缓存

java - Spring Data 'Left Join Fetch' 查询返回空值

java - 无法在java程序中运行.bat文件

java - 有没有与列表一起使用的函数来跳转下一行?