1

У меня возникли проблемы с получением правильного URL-адреса для самообслуживания, используя пружинные данные с пружинными данными jpa.Spring data-rest некорректный ресурс href

Так у меня есть класс Student:

@Entity 
@Table(name="student", schema="main") 
public class Student { 

    @Id 
    private Long id; 

    ... 
    ... 

    @OneToOne 
    @JoinColumn(name = "id") 
    private StudentInformation studentInformation; 
} 

с соответствующим хранилище файлов

@RepositoryRestResource(collectionResourceRel = "students", path = "students") 
public interface StudentRepository extends PagingAndSortingRepository<Student, Long> { 

} 

Существует также StudentInformation класс

@Entity 
@Table(name="studentinformation", schema="main") 
public class StudentInformation { 

    @Id 
    private Long id; 

    ... 
    ... 
} 

(другие свойства/геттеры/сеттеры опущено)

с соответствующим хранилищем

@RepositoryRestResource(collectionResourceRel = "studentinformation", path = "students/studentinformation") 
public interface StudentInformationRepository extends CrudRepository<StudentInformation, Long> { 
} 

Студенческих дисплеями, как я бы ожидать, когда я искать один по его идентификатору,

{ 
    "id": 1, 
    ... 
    ... 
    "_links": { 
    "self": { 
     "href": "http://localhost:8080/students/1" 
    }, 
    "student": { 
     "href": "http://localhost:8080/students/1" 
    }, 
    "studentinformation": { 
     "href": "http://localhost:8080/students/1/studentinformation" 
    } 
    } 
} 

кроме случаев, когда я по ссылке от студентов до studentInformation, studentInformation имеет неправильная связь.

{ 
    "id": 1, 
    ... 
    ... 
    "_links": { 
    "self": { 
     "href": "http://localhost:8080/students/studentinformation/1" 
    }, 
    "studentinformation": { 
     "href": "http://localhost:8080/students/studentinformation/1" 
    } 
    } 
} 

Как я могу получить эту ссылку, чтобы прочитать "HREF": "http://localhost:8080/students/1/studentinformation вместо "HREF":" http://localhost:8080/students/studentinformation/1 "

Благодаря

ответ

1

Прежде всего, многосегментная путь например students/studentinformation, возможно, он не работает, поскольку он не поддерживается, см. this answer, поэтому не сосредотачивайтесь на разработке своих URL. Если вам действительно нужно иметь представление http://localhost:8080/students/1/studentinformation - вам нужно определить настраиваемый контроллер для этого и не полагайтесь на Spring Data REST.

Во-вторых, не лучше ли использовать projections, чтобы иметь разные данные о студентах на /students оконечная точка? Если это просто другое представление ресурса Student, я бы пошел с проекциями, например. students/1?projection=minimal и students/1?projection=full.

В случае studentinformation содержит совершенно разные данные, чем students и это не представление Student ресурса, просто определить конечную точку для /studentinformation.

+0

Спасибо за ответ. Итак, вы говорите, что нет способа укладывать ресурсы в собственный URL-адрес href? например, 'http: // localhost: 8080/RESOURCE/{id}/SUB_RESOURCE' using @RepositoryRestResource? Я должен был бы определить свои собственные контроллеры REST? Это кажется странным – user2254140

+0

К сожалению, да, вы можете проверить это в ссылке, которую я предоставил, но не в репозиториях. Если бы вы нашли какой-либо способ сделать это - было бы хорошо знать. То, как это можно сделать, - это определить @RepositoryRestController с вашей пользовательской реализацией и связать его с вашим ресурсом. –

+0

Если вы хотите пойти с реализацией репозиториев, вы можете сделать 'SUB_RESOURCE/{ID}? RESOURCE_ID = {RESOURCE_ID}' –

 Смежные вопросы

  • Нет связанных вопросов^_^