簡體   English   中英

彈簧靴。 如何將 Optional<> 傳遞給實體類

[英]Spring Boot. how to Pass Optional<> to an Entity Class

我目前正在使用 spring 制作一個網站,我偶然發現了這個基本場景,我不知道如何解決這個特定的代碼:Entity = Optional;

RoomEntity roomEntity =  roomRepository.findById(roomId);

ReservationResource(API請求類):

    public class ReservationResource {
    @Autowired
    RoomRepository roomRepository;

    @RequestMapping(path = "/{roomId}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public ResponseEntity<RoomEntity> getRoomById(
    @PathVariable
    Long roomId){
        RoomEntity roomEntity =  roomRepository.findById(roomId);
        return new ResponseEntity<>(roomEntity, HttpStatus.OK);}
    }}

RoomRepository 類:

public interface RoomRepository extends CrudRepository<RoomEntity, Long> {
    List<RoomEntity> findAllById(Long id);
}

房間實體

@Entity
@Table(name = "Room")
public class RoomEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Long id;

    @NotNull
    private Integer roomNumber;

    @NotNull
    private String price;

    public RoomEntity() {
        super();
    }
}

根據您的錯誤,您正在從存儲庫的 findAll 方法中獲取Optional<RoomEntity>並將其轉換為RoomEntity

而不是RoomEntity roomEntity = roomRepository.findById(roomId); 做這個

Optional<RoomEntity> optinalEntity = roomRepository.findById(roomId); RoomEntity roomEntity = optionalEntity.get();

答案缺乏一些工作要做。 在調用get()之前,您應該使用isPresent()進行一些檢查。 像這樣:

Optional<RoomEntity> optionalEntity =  roomRepository.findById(roomId);
if (optionalEntity.isPresent()) {
    RoomEntity roomEntity = optionalEntity.get();
    ...
}

閱讀這篇關於可選項的精彩文章: https : //dzone.com/articles/using-optional-correctly-is-not-optional

試試這個,它對我有用

RoomEntity roomEntity = roomRepository.findById(roomId).orElse(null);

第一個解決方案

您可以實現JpaRepository而不是CrudRepository ,它提供了一個 getOne 方法,可以按照您的預期返回 RoomEntity 。 JpaRepository for JPA 或MongoRepository for MongoDB):

public interface RoomRepository extends JpaRepository<RoomEntity, Long> {
    List<RoomEntity> findAllById(Long id);
}

RoomEntity roomEntity = roomRepository.getOne(roomId);

請注意,如果此 roomId 沒有 RoomEntity,則會拋出EntityNotFoundException

第二種解決方案

CrudRepository 的 findById 方法返回一個可選項,因此您必須正確處理它才能獲得 RoomEntity(如果有)。 例如 :

RoomEntity roomEntity = optionalEntity.roomRepository.findById(roomId).get();

在這種情況下,如果此 roomId 沒有 RoomEntity, .get()將拋出NoSuchElementException

這篇文章可能有助於理解可選項: http : //www.baeldung.com/java-optional

進行此鑄造的最短方法

RoomEntity roomEntity = roomRepository.findById(roomId).get();

正如@kaush-athukorala 所說,您只需在RoomEntity roomEntity = roomRepository.findById(roomId);的末尾添加.get() RoomEntity roomEntity = roomRepository.findById(roomId); 有用

你會有RoomEntity roomEntity = roomRepository.findById(roomId).get();

RoomEntity roomEntity = roomRepository.findById(id).get();

這將解決您的錯誤!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM