В настоящее время я создаю веб-сайт с использованием 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);
}
RoomEntity
@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();
}
}
Я пытаюсь решить первую строку кода, которую я опубликовал, потому что ошибка говорит: «Несоответствие типа: невозможно преобразовать из Optional <RoomEntity> в RoomEntity»
Вы не можете сделать это преобразование. У вас Optional<RoomEntity>, а не RoomEntity. Вам нужно получить его, если он существует.
Да, сэр, поэтому я ищу ответ. ощущение того, что вы новичок в весенних ботинках. да, у меня это есть прямо сейчас.
Это больше связано с классом Java 8 Optional и лишь косвенно связано с Spring Boot. Я мог бы просто сказать конкретный вызов API, который вы хотели бы использовать для возврата значения, но проблема в том, что значение может быть null, которое нежелательно всегда возвращать обратно. Есть более глубокая проблема, которая заключается в понимании паттерна Optional, когда его используют, почему он ценен и как вы справляетесь с возможностью того, что Optional будет пустым. Немного сложно инкапсулировать только в ответ один ...
странно, что в руководстве, которому я следую, у него все проходит гладко. "RoomEntity roomEntity = roomRepository.findById (roomId);" работает отлично.
@kurtestacion может он использует предыдущую версию spring?
Это правда, сэр.




В соответствии с вашей ошибкой вы получаете Optional<RoomEntity> из метода findAll репозитория и передаете его на RoomEntity.
Вместо RoomEntity roomEntity = roomRepository.findById(roomId); сделайте это
Optional<RoomEntity> optinalEntity = roomRepository.findById(roomId);
RoomEntity roomEntity = optionalEntity.get();
Это работает отлично, отметьте ваш ответ, который мне очень помог. Спасибо
Спасибо! У меня это работает. Есть ли возможность просто отключить необязательную часть репо? Я до сих пор не знаю, как это вообще становится необязательным ...
Метод @Rdev findById(ID id) взят из CrudRepository<T, ID>. Они изменили тип возврата с T на Optional<T>, чтобы избежать NullPointerException. Я не вижу смысла заменять его, чтобы вернуть ваш объект T вместо Optional, но если вы все же хотите, вам нужно переопределить findById(ID id) или вы можете использовать JPARepository вместо CrudRepository и вызвать метод getOne(ID id).
Первое решение
Вы можете реализовать JpaRepository вместо CrudRepository, который предоставляет метод getOne, который возвращает RoomEntity, как вы ожидаете. (JpaRepository для JPA или MongoRepository для MongoDB):
public interface RoomRepository extends JpaRepository<RoomEntity, Long> {
List<RoomEntity> findAllById(Long id);
}
а также
RoomEntity roomEntity = roomRepository.getOne(roomId);
Обратите внимание, что EntityNotFoundException будет выдан, если для этого roomId нет RoomEntity.
Второе решение
Метод findById CrudRepository возвращает необязательный параметр, поэтому вы должны правильно обработать его, чтобы получить RoomEntity, если он есть. Например :
RoomEntity roomEntity = optionalEntity.roomRepository.findById(roomId).get();
В этом случае .get() выдаст NoSuchElementException, если для этого roomId нет RoomEntity.
Эта статья может помочь разобраться в опциях: http://www.baeldung.com/java-optional
Попробуй, у меня это работает
RoomEntity roomEntity = roomRepository.findById(roomId).orElse(null);
Это неверно; он побеждает саму цель Optional. Optional был введен, чтобы избежать работы со значениями null. Если мы действительно хотим присвоить переменной несуществующее значение, мы должны использовать Optional.empty ().
С ответами не хватает работы. Перед тем как вызвать в 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).get();
Как сказал @ kaush-athukorala, вам нужно просто добавить .get() в конце RoomEntity roomEntity = roomRepository.findById(roomId); Это работает
У вас будет RoomEntity roomEntity = roomRepository.findById(roomId).get();
RoomEntity roomEntity = roomRepository.findById(id).get();
Это решит вашу ошибку!
Я в замешательстве. Вы получаете
Optional<RoomEntity>обратно сfindById. Вы получаете обратноIterable<RoomEntity>сfindAllById. Что конкретно ты хотел снова?