Создать новую модель с существующими отношениями - PullRequest
0 голосов
/ 27 сентября 2019

Итак, у меня есть модель с именем Issue, эта модель имеет отношение под названием IssueType.
A Issue имеет type_id, который связывает их вместе.
A IssueType имеет id и name, которые уникальны.

Проблема в том, что когда я хочу создать проблему, я хочу отправить запрос, подобный этому

POST https://server/issues
Content-Type: application/json

{
  "description": "just some random description",
  "type": "Generic"
}

Итак, type - это name из IssueType при его создании.

Как мне это сделать?

@Table(name = "issues")
@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity
public class Issue {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

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

    @OneToOne(cascade = CascadeType.ALL)
    @JoinColumn(name = "type_id", referencedColumnName = "id")
    private IssueType type;
}
@Table(name = "issue_types")
@AllArgsConstructor
@NoArgsConstructor
@Data
@Entity
public class IssueType {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column()
    private String name;
}
@RepositoryRestResource(
    collectionResourceRel = "issues",
    path = "issues",
    excerptProjection = IssueProjection.class
)
public interface IssueRepository extends JpaRepository<Issue, Long> {
}
@Projection( types = Issue.class)
public interface IssueProjection {
    Long getId();

    Double getLongitude();

    Double getLatitude();

    Integer getFloor();

    String getDescription();

    @Value("#{target.type.name}")
    String getType();
}

Ответы [ 2 ]

2 голосов
/ 27 сентября 2019

Я считаю, что здесь вам нужно то, что Spring Data Rest называет определяющими типами поиска:

Очень часто доменные модели содержат типы, которые являются объектами значений, но на самом деле представляют определенное значение извыделенный набор возможных значений.Класс Country в приведенном выше примере фактически относится к этой категории.Поскольку нам нужно управлять супернабором значений, существует хранилище.Если также необходимо разрешить управление набором через REST, хранилище также необходимо экспортировать.Поскольку репозитории обычно указывают на управляемую совокупность, способ обработки этого сценария по умолчанию в Spring Data REST будет заключаться в отображении ссылок на ресурс ассоциации везде, где встречается экземпляр Country. В выпуске Hopper добавлено средство для объявления так называемых типов поиска, для которых Spring Data REST затем отображает отдельное свойство, встроенное в представление, а также регистрирует соответствующий десериализатор Джексона, чтобы убедиться, что значение этого свойства переводится обратно в экземпляр.этого типа значения для запросов PUT и POST.

https://spring.io/blog/2016/05/03/what-s-new-in-spring-data-hopper#lookup-types

и

https://docs.spring.io/spring-data/rest/docs/current/reference/html/#_customizing_item_resource_uris

Так что-то вроде:

  @Override
  public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config) {
    config.withEntityLookup()
      .forRepository(IssueType.class)
      .withIdMapping(IssueType::name)
      .withLookup(IssueTypeRepository::findByName); 
  }
}
0 голосов
/ 27 сентября 2019

Вы можете создать отдельный объект, такой как IssueDto, который будет представлять ваш запрос JSON, как показано ниже:

@Data
public class IssueDto {
   private String type;
   private String description;
}

Затем преобразовать этот объект в ваши Issue и IssueType объекты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...