Весенний ботинок. как передать Optional <> в класс сущности

В настоящее время я создаю веб-сайт с использованием 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> обратно с findById. Вы получаете обратно Iterable<RoomEntity> с findAllById. Что конкретно ты хотел снова?

Makoto 05.05.2018 04:37

Я пытаюсь решить первую строку кода, которую я опубликовал, потому что ошибка говорит: «Несоответствие типа: невозможно преобразовать из Optional <RoomEntity> в RoomEntity»

kurt estacion 05.05.2018 04:43

Вы не можете сделать это преобразование. У вас Optional<RoomEntity>, а не RoomEntity. Вам нужно получить его, если он существует.

Makoto 05.05.2018 04:47

Да, сэр, поэтому я ищу ответ. ощущение того, что вы новичок в весенних ботинках. да, у меня это есть прямо сейчас.

kurt estacion 05.05.2018 04:48

Это больше связано с классом Java 8 Optional и лишь косвенно связано с Spring Boot. Я мог бы просто сказать конкретный вызов API, который вы хотели бы использовать для возврата значения, но проблема в том, что значение может быть null, которое нежелательно всегда возвращать обратно. Есть более глубокая проблема, которая заключается в понимании паттерна Optional, когда его используют, почему он ценен и как вы справляетесь с возможностью того, что Optional будет пустым. Немного сложно инкапсулировать только в ответ один ...

Makoto 05.05.2018 04:50

странно, что в руководстве, которому я следую, у него все проходит гладко. "RoomEntity roomEntity = roomRepository.findById (roomId);" работает отлично.

kurt estacion 05.05.2018 04:56

@kurtestacion может он использует предыдущую версию spring?

Nándor Előd Fekete 05.05.2018 04:57

Это правда, сэр.

kurt estacion 05.05.2018 10:48
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
14
8
27 122
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Ответ принят как подходящий

В соответствии с вашей ошибкой вы получаете Optional<RoomEntity> из метода findAll репозитория и передаете его на RoomEntity.

Вместо RoomEntity roomEntity = roomRepository.findById(roomId); сделайте это

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

Это работает отлично, отметьте ваш ответ, который мне очень помог. Спасибо

mukesh krishnan 11.11.2019 11:58

Спасибо! У меня это работает. Есть ли возможность просто отключить необязательную часть репо? Я до сих пор не знаю, как это вообще становится необязательным ...

Rdev 01.04.2021 08:00

Метод @Rdev findById(ID id) взят из CrudRepository<T, ID>. Они изменили тип возврата с T на Optional<T>, чтобы избежать NullPointerException. Я не вижу смысла заменять его, чтобы вернуть ваш объект T вместо Optional, но если вы все же хотите, вам нужно переопределить findById(ID id) или вы можете использовать JPARepository вместо CrudRepository и вызвать метод getOne(ID id).

hiren 01.04.2021 08:27

Первое решение

Вы можете реализовать 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 ().

Jan Bodnar 12.07.2019 11:00

С ответами не хватает работы. Перед тем как вызвать в 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();

Это решит вашу ошибку!

Другие вопросы по теме