Spring Data Rest(SDR)的bug?持久实体不能为空

IT小君   2023-09-16T20:01:24

我正在进行一个Spring Data Rest的POC。尝试从存储库中得到可用的JSON。

我有一个实体类(NewTask)

@Entity
@Table(name="newtable")
public class NewTask {

    @Id
    @Column(name="newid")
    private int id;


    @Column(name="newage")
    private int age;

    @Column(name="newaddress")
    private String address;



    public String getAddress() {
        return address;
    }
    public void setAddress(String address) {
        this.address = address;
    }
    public int getId() {
        return id;
    }
    public void setId(int id) {
        this.id = id;
    }
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }

}

还有一个对应的存储库..

    @RepositoryRestResource
    @PreAuthorize("hasRole('ROLE_ADMIN')")
    public interface NewTaskRepository extends CrudRepository<NewTask, Serializable>{


        @Query("SELECT t.address FROM NewTask t where t.id = :id")
        String findByMyId(@Param("id") int id);

      }         

每当我访问

http://localhost:8080/POCDB/newTasks/search/findByMyId?id=1

我得到以下错误: {"cause":null,"message":"PersistentEntity must not be null!"}

现在这是我的存储库是如何看起来的: 请阅读每个方法的注释

   //Gives- PersistentEntity must not be null!!!
    @Query("SELECT t.address FROM NewTask t where t.id = :id")
    String findByMyId(@Param("id") int id);


    //WORKS FINE
    @Query("SELECT t.id FROM NewTask t where t.id = :id")
    int findId(@Param("id") int id);


    //WORKS FINE
    @Query("SELECT t.id FROM NewTask t where t.id = :id")
    Integer findIdTwo(@Param("id") int id);

    //Gives- PersistentEntity must not be null!!!
    @Query("SELECT t.id FROM NewTask t")
    List<Integer> findIds();

我不确定返回类型有什么问题。我参考了下面的链接以获得一些解决方案:

How does one create a custom query in jparepository but return an object other than the entity?

并且在我的存储库中添加了2个不适用于我的方法

    // returns in some weird format
    @Query("SELECT t.address FROM NewTask t where t.id = :id")
    PString findByMyId(@Param("id") int id);

    //Gives- PersistentEntity must not be null!!!
    @Query("SELECT t.address FROM NewTask t")
    List<PString> findAddress();

我有一种直觉,这是SDR的一个bug,或者我漏掉了什么?

评论(3)
IT小君

Spring Data REST只能返回已注册的存储库中的数据。在您引用的另一个问题中,您会注意到他们专门为所需类型创建了一个自定义存储库。这不是SDR的错误,这只是它的功能。它也保持了RESTful的特性。

所以在您的情况下,SDR只能返回NewTask或NewTask的集合。

2023-09-16T20:01:28   回复
IT小君

在Spring Boot中,如果Spring主应用程序无法扫描到您的领域(POJO)类,则会抛出此错误,除非您将所有类放在同一个包中。然后您需要在Spring主应用程序类的顶部添加组件扫描注解

@ComponentScan(basePackages = "com.aaa.bbbb.ccccc")
2023-09-16T20:01:33   回复
IT小君

我使用的是Spring Data Mongo而不是JPA,但对我有效的是在Mongo的"select"语句中包含_class字段。Spring使用这个字段将数据库结果映射回实体/文档。

另外,看一下@TypeAlias,以便在领域类之间移动时拥有一致的_class值。

当我使用Spring的projections预先投影数据库结果时,我也遇到了同样的问题。后来当我将结果转换为分页资源时,框架无法将投影接口识别为持久实体,因此无法找到它所需的必要元数据来进行转换。这种情况的解决方案是自定义资源组装器。

2023-09-16T20:01:41   回复