Ошибка Spring Data Rest (SDR)? Постоянный объект не должен быть нулевым

В настоящее время я работаю над POC для Spring Data Rest. Попытка получить работоспособный 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 не должен быть 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();

Я не уверен, каковы проблемы с возвращаемыми типами. Я ссылался на ссылку ниже для некоторого решения:

Как можно создать собственный запрос в jparepository, но вернуть объект, отличный от сущности?

и добавил еще 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, или я что-то упустил?


person Dipanshu Verma    schedule 05.11.2015    source источник
comment
Дублирующий вопрос. stackoverflow.com/a/30403914/621686   -  person bvulaj    schedule 05.11.2015
comment
Привет, Брэндон. Ответ, который вы опубликовали, не работает в моем случае. Кроме того, это не проблема наследования, базового класса нет, но сообщение об ошибке такое же. Не могли бы вы помочь с решением, если у вас есть какие-либо идеи? Или можете посоветовать того, кто может?   -  person Dipanshu Verma    schedule 06.11.2015


Ответы (3)


Spring Data REST может возвращать только те данные, для которых зарегистрирован репозиторий. В другом вопросе, на который вы ссылаетесь, вы заметите, что они создали собственный репозиторий специально для нужного им типа. Это не ошибка в SDR, это просто то, как она работает. Это также сохраняет его RESTful.

Так что в вашем случае SDR может возвращать только NewTask или наборы NewTask.

person bvulaj    schedule 06.11.2015
comment
Да, я понял эту часть, но, как вы видите в вопросе выше, почему он не выдает ту же ошибку, когда я возвращаю целое число? - person Dipanshu Verma; 07.11.2015
comment
У меня очень похожая проблема при возврате атрибута enum объекта: ' @Query (выберите d.status из Deal as d, где d.id = :id) Deal.Status findStatusById(@Param(id) Long id);' Я понимаю, что spring-data-rest не должен возвращать ничего, кроме ресурсов, но почему int в порядке? С другой стороны, если я хочу, чтобы этот запрос не подвергался воздействию spring-data-rest, как это было бы возможно? - person Gregor; 07.01.2016
comment
Целое допустимо, поскольку предполагается, что оно является идентификатором ресурса (аннотация (@Id в поле int). - person afaulconbridge; 31.05.2016
comment
Предположим, я хочу вернуть список‹String›, запросив столбец имени из пользовательской таблицы. Как я могу сделать это в Spring Data REST. - person Galet; 27.10.2016

В Spring Boot, если основное приложение Spring не смогло сканировать классы вашего домена (POJO), эта ошибка будет выдана, если вы не поместите все свои классы в один и тот же пакет. Затем вы добавляете аннотацию сканирования компонента поверх основного класса приложения Spring.

@ComponentScan(basePackages = "com.aaa.bbbb.ccccc")
person Buru    schedule 05.01.2017

Я использую Spring Data Mongo, а не JPA, но мне помогло включение поля _class в оператор "select" Mongo. Spring использует это поле для отображения результатов БД обратно в объект/документ.

Также взгляните на @TypeAlias, чтобы у вас было постоянное значение _class при перетасовке классов домена.

Я также столкнулся с той же проблемой, когда предварительно проецировал результаты БД с помощью Spring projections. Позже, когда я преобразовывал результаты в ресурсы с разбивкой на страницы, фреймворк не мог идентифицировать интерфейс проекции как постоянный объект и, следовательно, не мог найти необходимые метаданные, необходимые для преобразования для меня. Решением для этого варианта использования был пользовательский ассемблер ресурсов.

person Miguel Pereira    schedule 04.10.2019