Spring Data Rest(SDR)错误?持久实体不能为空

时间:2015-11-05 07:01:24

标签: java spring spring-data-jpa spring-data-rest

目前我正在开发Spring Data Rest的POC。试图获得存储库的可用JSONout。

我有一个实体类(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不能为空!”}

现在我的存储库看起来如何:请阅读每个方法的评论

   //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中的一个错误,还是我错过了什么?

3 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:0)

在Spring Boot中,如果spring主应用程序无法扫描您的域(POJO)类,那么除非您将所有类放在同一个包中,否则将抛出此错误。然后,您在Spring主应用程序类

之上添加了组件扫描注释
@ComponentScan(basePackages = "com.aaa.bbbb.ccccc")

答案 2 :(得分:0)

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

还请查看 @TypeAlias ,以便在围绕域类进行混洗时拥有一致的_class值。

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