java - CrudRepository 中的 findById(ID) - 尝试使用不兼容的返回类型

标签 java spring-security spring-data

我已经定义了消息实体

@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);

}

我收到以下错误 Error

当我使用时

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

还是不行。 我明白了,“Message message = messageRepository.findById(id);”无法转换,我应该将变量“message”类型更改为“Optional<”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!

有人可以提出替代解决方案吗? 谢谢

最佳答案

Spring 数据会将您的方法名称转换为实际的数据库查询。但这并不会神奇地发生。当然 spring 确实有魔法,但是你必须遵循语法。

在你的第一个方法中,Message findById(Long id); Spring 知道你需要 Message 对象,并且需要通过 message_id 找到它。这将其转换为类似于以下内容的内容。

从 Message msg 中选择 msg,其中 msg.id = ?1;

?1 将替换为您的方法参数。

如果您不希望 Spring 为您生成查询,那么您必须使用 @Query 并提供您自己的自定义查询。(在这种情况下方法名称并不重要。)

您可以如上所述实现此目的 here .

现在,回到你的错误, Spring 无法理解您的方法 Message findOne(Long id);。 因为它需要语法 findBy

您可以从 spring documentations 找到有效的方法名称.

我不明白的是,方法 Message findById(Long id);Message findOne(Long id); 有何不同。我想他们都尝试从 messageId 获取 Message。

关于java - CrudRepository 中的 findById(ID) - 尝试使用不兼容的返回类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60375346/

相关文章:

java - 如何将网页字体字符编码转换为java unicode字符?

java - WebDataBinder#getObjectName() 可以返回 null 吗?

redis - Jackson2HashMapper 不使用 Flatten=True 序列化 Date

java - CrudRepository 不删除行

java - java (android) 中的 ImageIO 类中的这个错误是什么?

java - GWT - 服务器端 - 如何使用 eclipse 将外部库添加到 war 文件

spring - 如何使用 Spring 安全性和 Spring 安全性对象中的属性限制对 URL 的访问?

java - Spring Security 的编程使用

grails - Spring Security编码密码从旧版本到新版本的问题

spring - 在 spring jparepository 中加入多个表