Java 8 Optional.ofNullable.map создает ошибку ссылки на нестатический метод

У меня есть способ проверить получателя электронной почты.

В моем коде .map(Recipient::getId) выдает ошибку:

Non static method cannot be reference from a static context.

private Long verifyRecipient(Long recipientId) throws NotFoundException {
    return Optional.ofNullable(recipientRepository.findById(recipientId))
            .map(Recipient::getId)
            .orElseThrow(()-> new NotFoundException("recipient with ID" + recipientId +
                    " was not found"));
}

Recipient класс:

@Entity
public class Recipient {
    @Id
    @GeneratedValue
    private Long id;

    @NotBlank
    private String name;

    @NotBlank
    @Email
    @Column(unique = true)
    private String emailAddress;

    public Long getId() {
        return id;
    }

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

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmailAddress() {
        return emailAddress;
    }

    public void setEmailAddress(String emailAddress) {
        this.emailAddress = emailAddress;
    }
}

Я использую SpringBoot и H2 в базе данных памяти.

Так что у меня тоже есть интерфейс RecipientRepository:

public interface RecipientRepository extends JpaRepository<Recipient, Long> {}

Определение метода findById():

Optional<T> findById(ID var1);

Если вы используете аналогичную логику со сборкой экземпляра, это будет действительным, поэтому я бы предположил, что recipientRepository.findById(recipientId) не возвращает Recipient, поэтому компилятор ожидает использовать метод static getId(SomeClass), где SomeClass - это тип, возвращаемый findById.

AxelH 12.06.2018 12:04
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
1
824
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Метод findById() уже возвращает Optional<T>, поэтому в этой ситуации вам не нужно оборачивать результат дополнительным Optional.ofNullable().

Собственно, строка:

Optional.ofNullable(recipientRepository.findById(recipientId));

возвращает Optional<Optional<Recipient>>, который является избыточным.

Вместо этого вы можете просто написать:

private Long verifyRecipient(Long recipientId) throws NotFoundException {
    return recipientRepository.findById(recipientId)
        .map(Recipient::getId)
        .orElseThrow(() ->
            new NotFoundException("Recipient with ID " + recipientId + " was not found"));
}

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