[SPRING] Spring 데이터 나머지 @EmbeddedId는 Post 요청에서 생성 할 수 없습니다.
SPRINGSpring 데이터 나머지 @EmbeddedId는 Post 요청에서 생성 할 수 없습니다.
JPA 엔티티 Person과 엔티티 팀이 있습니다. 둘 다 엔티티 PersonToTeam에 의해 결합됩니다. 이 참여 엔티티는 Person과 Team간에 1 대 1의 관계를 유지합니다. 그것은 Person과 @ImbeddedId로 대표되는 Team의 id로 구성된 multi-column 키를 가지고 있습니다. 임베디드 ID를 요청 ID로 앞뒤로 변환하려면 변환기가 있어야합니다. 이 모든 것은 스프링 데이터 REST @Idclass가 인식되지 않는 것에 대한 제안을 따른다.
코드는 다음과 같습니다.
@Entity
public class PersonToTeam {
@EmbeddedId
@Getter
@Setter
private PersonToTeamId id = new PersonToTeamId();
@ManyToOne
@Getter
@Setter
@JoinColumn(name = "person_id", insertable=false, updatable=false)
private Person person;
@ManyToOne
@Getter
@Setter
@JoinColumn(name = "team_id", insertable=false, updatable=false)
private Team team;
@Getter
@Setter
@Enumerated(EnumType.STRING)
private RoleInTeam role;
public enum RoleInTeam {
ADMIN, MEMBER
}
}
@EqualsAndHashCode
@Embeddable
public class PersonToTeamId implements Serializable {
private static final long serialVersionUID = -8450195271351341722L;
@Getter
@Setter
@Column(name = "person_id")
private String personId;
@Getter
@Setter
@Column(name = "team_id")
private String teamId;
}
@Component
public class PersonToTeamIdConverter implements BackendIdConverter {
@Override
public boolean supports(Class<?> delimiter) {
return delimiter.equals(PersonToTeam.class);
}
@Override
public Serializable fromRequestId(String id, Class<?> entityType) {
if (id != null) {
PersonToTeamId ptid = new PersonToTeamId();
String[] idParts = id.split("-");
ptid.setPersonId(idParts[0]);
ptid.setTeamId(idParts[1]);
return ptid;
}
return BackendIdConverter.DefaultIdConverter.INSTANCE.fromRequestId(id, entityType);
}
@Override
public String toRequestId(Serializable id, Class<?> entityType) {
if (id instanceof PersonToTeamId) {
PersonToTeamId ptid = (PersonToTeamId) id;
return String.format("%s-%s", ptid.getPersonId(), ptid.getTeamId());
}
return BackendIdConverter.DefaultIdConverter.INSTANCE.toRequestId(id, entityType);
}
}
이 변환기의 문제점은 게시물 요청이 새 personToTeam 연결을 만들려고 할 때 fromRequestId 메서드가 id 매개 변수로 null을 가져옵니다. 그러나 게시물의 탑재량에 대한 다른 정보는 없습니다. 그럼 어떻게 그 사람과 팀에 외래 키를 가진 이드를 만들어야합니까? 더 일반적인 질문 : 봄 데이터 휴식에서 다 - 대 - 다 모임을 처리하기위한 올바른 접근 방법은 무엇입니까?
해결법
-
==============================
1.같은 문제에 직면 한 후 해결책을 찾았습니다. fromRequestId ()에서 id가 null 인 경우 DefaultIdConverter 대신 새 PersonToTeamId ()를 반환한다는 것을 제외하고는 코드가 잘되어야합니다.
같은 문제에 직면 한 후 해결책을 찾았습니다. fromRequestId ()에서 id가 null 인 경우 DefaultIdConverter 대신 새 PersonToTeamId ()를 반환한다는 것을 제외하고는 코드가 잘되어야합니다.
게시물 요청에 JSON을 사용한다고 가정하면 personId 및 teamId를 ID 객체로 래핑해야합니다.
{ "id": { "personId": "foo", "teamId": "bar" }, ... }
그리고 @EmbeddedId의 일부가 간단한 데이터 형식이 아니라 외래 키인 경우 :
{ "id": { "stringId": "foo", "foreignKeyId": "http://localhost:8080/path/to/other/resource/1" }, ... }
from https://stackoverflow.com/questions/36606251/spring-data-rest-embeddedid-cannot-be-constructed-from-post-request by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] Junit에서 @Autowired 주석과 함께 @InjectMocks를 사용하는 방법 (0) | 2019.07.13 |
---|---|
[SPRING] @jobscope 빈을 Spring batch에서 분할 단계로 액세스 (0) | 2019.07.13 |
[SPRING] Spring 설정에서 빈 arraylists를 초기화 하시겠습니까? (0) | 2019.07.13 |
[SPRING] @Autowired (required = false) 생성자에서 NoSuchBeanDefinitionException을 제공함 (0) | 2019.07.13 |
[SPRING] Spring Boot : @Bean annotated 메소드 내에서 명령 행 인자 가져 오기 (0) | 2019.07.13 |