Java Crudepository中的findById(ID)-试图使用不兼容的返回类型

Java Crudepository中的findById(ID)-试图使用不兼容的返回类型,java,spring-security,spring-data,Java,Spring Security,Spring Data,我已经定义了消息实体 @实体 公共类消息{ @身份证 @生成值() 私人长id; @奥内托内 @NotNull 私人用户; @NotEmpty(message=“text是必需的”) 私有字符串文本; @NotEmpty(message=“title是必需的”) 私有字符串标题; 公共用户getUser(){ 返回用户; } 公共void setUser(用户){ this.user=用户; } 公共字符串getText(){ 返回文本; } 公共void setText(字符串文本){ thi

我已经定义了消息实体

@实体
公共类消息{
@身份证
@生成值()
私人长id;
@奥内托内
@NotNull
私人用户;
@NotEmpty(message=“text是必需的”)
私有字符串文本;
@NotEmpty(message=“title是必需的”)
私有字符串标题;
公共用户getUser(){
返回用户;
}
公共void setUser(用户){
this.user=用户;
}
公共字符串getText(){
返回文本;
}
公共void setText(字符串文本){
this.text=文本;
}
公共字符串getTitle(){
返回标题;
}
公共无效集合标题(字符串标题){
this.title=标题;
}
公共长getId(){
返回id;
}
公共无效集合id(长id){
this.id=id;
}
}
积垢

public interface MessageRepository扩展了crudepository{
@PostAuthorize(“hasPermission(returnObject,'message')”)
消息findById(长id);
Iterable findByUserId(长id);
@PostAuthorize(“hasPermission(returnObject,'privateMessage'))
消息findOne(长id);
}
我得到以下错误

当我使用

@PostAuthorize(“hasPermission(returnObject,'message'))
可选的findById(长id);
还是不行。
我知道“Message Message=messageRepository.findById(id);”无法转换,我应该将变量“Message”类型更改为“OptionalSpring数据将把方法名转换为实际的数据库查询。但这并不是神奇的。Spring当然有魔力,但您必须遵循语法

在您的第一个方法中,
messagefindbyid(Long id);
Spring理解您需要Message对象,并且需要通过Message_id来查找它

从消息msg中选择msg,其中msg.id=?1

?1
将被方法参数替换

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

您可以实现上述目标

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

您可以从中找到有效的方法名称


我不明白的是,方法
messagefindbyid(长id);
messagefindone(长id)是如何实现的
不同。我想他们都试图从messageId获取消息。

Spring数据将把方法名转换为实际的数据库查询。但这并不是神奇的。Spring当然有魔力,但你必须遵循语法

在您的第一个方法中,
messagefindbyid(Long id);
Spring理解您需要Message对象,并且需要通过Message_id来查找它

从消息msg中选择msg,其中msg.id=?1

?1
将被方法参数替换

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

您可以实现上述目标

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

您可以从中找到有效的方法名称


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

删除
findOne
方法或添加
@Query
来添加查询。这根本不起作用。方法
findById如何(长id);
消息findOne(长id);
不同?你对这两种方法有什么期望?对我来说似乎是一样的。(按id查找消息)删除
findOne
方法或添加
@Query
以添加查询。这根本不起作用。方法
findById(长id)如何
消息findOne(长id);
不同?你对这两种方法有什么期望?对我来说似乎是一样的。(按id查找消息)你好,阿伦,谢谢你的回答。回答你的问题:这是为了尽可能简单地展示两种不同的权利。通过
findById
找到的消息可以被当前用户和管理员查看,而通过
findOne
找到的消息只能被当前用户查看。在这种情况下,我建议在服务层而不是DAO层上拥有这些授权。在使用spring数据时,您确实不能弄乱方法名称。希望DAO层上的helpsEven可以归结为这一点。管理员和当前用户都可以访问
getMessageById
。例如:管理员和当前用户可以访问
X
,当前用户可以访问
X
n还可以访问
X
。这取决于管理员和当前用户都可以访问
X
。嗨,阿伦,谢谢你的回答。回答你的问题:这可以尽可能简单地演示两种不同的权限。通过
findById
找到的消息可以被当前用户和管理员查看,而通过
findOne
找到的所有消息只能由当前用户查看。在这种情况下,我建议将这些授权放在服务层,而不是DAO层。在使用spring数据时,您确实不能弄乱方法名称。希望DAO层的helpsEven可以归结为这一点。管理员和当前用户都可以cess
getMessageById
。例如:管理员和当前用户可以访问
XError 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!