findById (ID) в CrudRepository - попытка использовать несовместимый тип возврата - PullRequest
0 голосов
/ 24 февраля 2020

Я определил сущность сообщения

@Entity
public class Message {
    @Id
    @GeneratedValue()
    private long id;

    @OneToOne
    @NotNull
    private User user;

    @NotEmpty(message = "text is required")
    private String text;

    @NotEmpty(message = "title is required")
    private String title;

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public String getText() {
        return text;
    }

    public void setText(String text) {
        this.text = text;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public long getId() {
        return id;
    }

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

и CrudRepository

public interface MessageRepository extends CrudRepository<Message, Long> {


    @PostAuthorize("hasPermission(returnObject, 'message')")
    Message findById(Long id);

    Iterable<Message> findByUserId(Long id);

    @PostAuthorize("hasPermission(returnObject, 'privateMessage')")
    Message findOne(Long id);

}

Я получаю следующую ошибку Ошибка

Когда я использую

 @PostAuthorize("hasPermission(returnObject, 'message')")
  Optional<Message> findById(Long id);

по-прежнему не работает. Я получаю, что "Сообщение message = messageRepository.findById (id);" не может быть преобразован, и я должен изменить тип переменной "message" на "Необязательное <" Message> "

. Когда я это делаю, я получаю следующую ошибку:

Error creating bean with name 'defaultController': Unsatisfied dependency expressed through field 'messageRepository'; nested exception is org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'messageRepository': Invocation of init method failed; nested exception is java.lang.IllegalArgumentException: Failed to create query for method public abstract com.example.chapter5.data.Message com.example.chapter5.data.MessageRepository.findOne(java.lang.Long)! No property findOne found for type Message!

Может кто-нибудь предложить альтернативное решение? Спасибо

1 Ответ

0 голосов
/ 24 февраля 2020

Данные Spring преобразуют имена ваших методов в реальные запросы к базе данных. Но это не происходит волшебным образом. Конечно, Spring делает magi c, но вы должны следовать синтаксису.

В вашем первом методе Message findById(Long id); Spring понимает, что вам нужен объект Message, и вам нужно найти его по message_id. Это преобразуется следующим образом:

select msg from Message msg where msg.id = ?1;

?1 будет заменено аргументом вашего метода.

Если вы не сделаете wi sh Spring, чтобы сгенерировать запрос для вас, затем вы должны использовать @Query и задать свой собственный запрос. (Имя метода не имеет значения в этом случае.)

вы можете достичь этого, как упоминалось здесь .

Теперь, возвращаясь к вашей ошибке, Spring не может понять ваш метод Message findOne(Long id);. Поскольку он ожидает синтаксис findBy.

Вы можете найти действительные имена методов из весенней документации .

Я не понимаю, как работают методы Message findById(Long id); и Message findOne(Long id); разные. Я полагаю, они оба пытаются получить сообщение от messageId.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...