2011-10-04 2 views
5

양식의 집합에 제대로 바인딩하는 방법이 있습니까? 내가 POJO 바인딩 내 컨트롤러는 사용자 개체에 목록 대신 프레임 워크 FORM 바인딩 바인딩

public class Group implements Serializable { 

     public Long id; 

     public String name; 

    } 

내가없는 것을

public static void create(User user) 

user.java

public class User implements Serializable { 



    public Long id; 

    @Required 
    @Email 
    public String email; 

    public Set<Group> groups; 

} 

Group.java

을 소요하고있어

내 필드를 그룹에 묶기 위해서

나는 user.groups []. id, user.groups [0] .id, user.groups.id를 시도했다. 내가 잘 목록과 함께 작동하도록 할 수 있지만 게시물을 때 N 항목의 무리 (체크되지 않은 각 확인란에 대해 하나의 null) 잔뜩 N 요소 목록을 얻을 및 nulls없이 새 목록을 만들 수 있습니다. 그러나 그것은 틀린 것처럼 보인다. 편집

: 사용자 및 그룹이 지속적 엔티티이기 위하여 의미되지 않으며, 재생 단지 UserGroup 때문에,

답변

3

Play 1.2.4의 새로운 바인더 구현은 이것을 허용합니다.

플레이 버전에서

는 (12 월 02 2011 년 출시) 이전에 1.2.4 당신이이 목록에 바인딩

user.groups[1].id = 1 
user.groups[1].name = "name1" 
user.groups[3].id = 3 
user.groups[3].name = "name3" 
user.groups[4].id = 4 
user.groups[4].name = "name4" 

문제와 같은 전송 파라미터가 설정 한 바인딩 할 수 없습니다 당신이 목록을 얻을 것입니다 길이가 5 인 경우 0과 2의 값은 널입니다.

여전히 1.2.4보다 더 작은 플레이 버전을 사용해야하는 경우

,이 문제에 대한 해결 방법 대신 설정 또는 목록의
Map<String, Group> groups 

를 사용 할 수있다. 그 사이에 null 요소를 가져 오지 않고 groups.values ​​()를 호출하여 Collection을 가져옵니다.

+0

일단 이것을 확인해 주셔서 감사하겠습니다. – dstarh

+0

대괄호 안의 값은 목록 색인이며, 0부터 연속해야하며, Play가 null 값으로 추가되지 않은 경우 값이 연속되어야합니다. – tazmaniax

0

먼저 편안한 API에 대한 비 저장 및 영구 레스 프리젠 테이션 층 역할을하는 법인 것 같다 play.db.jpa.Model 클래스를 확장하고 @Entity으로 정의해야합니다. 예를 들어 : Model의 확장에

@Entity 
public class User extends Model { 

    ... 

} 

감사합니다, 당신은 (즉, 당신이 public Long id을 제거 할 수 있습니다) 기술적 ID를 정의 할 필요가 없습니다, 당신은이 클래스에 대한 일반적인 DAO있을 것이다합니다 (Javadoc 참조)

지금, 당신은 그렇게 User의 그룹을 정의 할 수 있습니다

@ManyToMany 
public Set<Group> groups; 
+0

몇 가지 사용자 및 그룹이 엔티티가 아니며, 재생은 안심할 수있는 API의 단순한 무국적이고 지속적인 프리젠 테이션 레이어로 작동합니다. 진짜 문제는 여기 아마도 어쩌면 내가 충분하지 않은 이유는 무엇입니까 양식은 SET에 바인딩 할 수 있지만 목록에 수 있습니다 – dstarh

0

나는 플레이와 비슷한 문제를 가지고있다. Play의 바인딩은 자동 매직이지만 때로는 해결 방법이 필요합니다.

당신은 단순히 세터

public void setGroups(List<Group> groups) 

를 만들 수 있습니다 그리고 당신의 세트에 제공되는 그룹을 설정 내부. 조금 더럽지 만 작동 할 것입니다.

바인딩을 시뮬레이트하기 위해 단위 테스트 케이스를 만드는 것이 좋습니다. POST 요청을 시뮬레이트하고지도를 객체에 바인딩하여 바인더에 바인딩하는지도를 만듭니다. 웹 인터페이스에서 프로세스를 반복하는 것보다 훨씬 쉽습니다. 회귀 테스트를 작성하고 Play의 업데이트로 인해 바인딩 동작이 중단되는 경우 알려줍니다 (나에게 일어난 일임).

+0

그래,이 작동하지만 여전히 당신의 필드에 이름을 필요가 변경되지 않습니다 obj .collection [index] .prop – dstarh