从Spring Data 1.11升级到Spring Data 2.0后出现"No property delete found for type SimpleEntity!"的错误。

4
我有一个简单的项目,里面定义了以下类。在spring-boot 1.5.4、spring-data-commons 1.13和spring-data-jpa 1.11中都能正常工作。
但是当我升级到spring-boot 2.0.0.M5、spring-data-commons 2.0.0和spring-data-jpa-2.0.0时,在启动时出现了PropertyReferenceException异常,错误信息为"SimpleEntity类型中找不到delete属性"。很遗憾,由于计算机非常关闭安全性,我无法获取堆栈跟踪。
有什么想法吗?我找到的其他帖子似乎不适用于我的情况。
以下是这些类(已经修改了名称,但您可以理解):
package entity;

@MappedSuperclass
public abstract class BaseEntity implements Serializable {
....
}

package entity;

@Entity
@Table(schema = "ENTITIES", name = "SIMPLE")
public class SimpleEntity extends BaseEntity {
    @Column(name = "ID")
    private Long id;

    @Column(name = "CODE")
    private String code;

    @Column(name = "NAME")
    private String name;

    ... getters and setters ...
}

package repository;
imoport org.springframework.data.repository.Repository

public interface SimpleRepository extends Repository<SimpleEntity, Long> {
  public SimpleEntity save(SimpleEntity entity);
  public List<SimpleEntity> save(List<SimpleEntity> entities);
  public void delete(Long id);
  public SimpleEntity findOne(Long id);
  public List<SimpleEntity> findAllByOrderByNameAsc();
  public List<SimpleEntity> findByCode(String code);
  public List<SimpleEntity> findByNameIgnoreCaseOrderByNameAsc(String name);
}
1个回答

5
原来在Spring Data 2.0 CrudRepository接口中存在一个重大变更。当以下条件同时满足时,我会收到错误提示:
  1. 您有一个1.x版本的Spring Data项目
  2. 您拥有一个直接扩展Repository接口的接口,而不是像CrudRepository这样的子接口
  3. 您的Repository子接口声明了CrudRepository中的"void delete(ID)"方法(在我的情况下为"void delete(Long)")
  4. 您升级到Spring Data 2.x
问题在于,在2.x版本中,CrudRepository不再具有"void delete(ID)"方法,它已被删除,取而代之的是新方法"void deleteById(ID)"。
当Spring Data看到它无法识别的delete方法签名时,它会产生一个关于您的实体类缺少delete属性的错误-这对1.2和2.x版本都是正确的。

我曾经遇到了同样的问题,但没有找到任何关于这种情况的文档。 - nivash
我不指望会有这方面的文档。请看上面的第2点:我选择使用Repository——一个空接口——在其中由我来正确定义一些CrudRepository的子集方法。如果我采用这种方式并声明一个具有未被识别签名的方法,那就是我的问题。这意味着我在升级时必须意识到这一点。Spring唯一能做得更好的是提供一个错误消息,只说声明了一个未被识别的方法签名,并提供指向特定版本Spring Data Repository接口的JavaDocs的URL。 - Greg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接