2014-04-07 2 views
1

스프링 4 구동 포틀릿에서 날짜 필드를 포함하는 데이터 개체가 있습니다. JSP 뷰에는 날짜 (dd/mm/yyyy)와 시간 (hh/mm)이라는 두 개의 별도 필드가 있습니다. 내 컨트롤러의 액션 핸들러는 @ModelAttribute -annotation 사용하여 폼 데이터를 수신 : 검증스프링 컨트롤러 전처리 @ModelAttribute 요청 매개 변수

@ActionMapping(params = "action=update") 
public void onUpdate(@Valid @ModelAttribute("myObject") MyObject myObject, 
    BindingResult bindingResult, ActionResponse response, SessionStatus status) 
{ 
    if (!bindingResult.hasErrors()) 
     myObjectService.save(myObject); 
    else 
     // provide 'myObject' in the view which displays validation errors 
} 

나는 형태로 데이터 이전 날짜와 시간을 병합 할 필요를 onUpdate()myObject를받는,이 아니라 MyObject에서부터 하나의 java.util.Calendar -field는 전체 날짜를 표시합니다.

아이디어 (1) 나는 또한 MyObject에 두 개의 필드로 날짜를 나눌 수있는이 필요 지금

내가 생각 해결하고 필요에 따라 값을 병합 게터 제공 :

@Column(name = "begin") 
public Calendar getBegin() 
{ 
    // return calendar object built from this.beginDate and this.beginTime 
} 

하지만이 방법은 여러 가지 이유로 좋은 생각이 아닙니다. (Hibernate Annotations - Which is better, field or property access?) 모델 개체가 데이터베이스 레코드의 미러가되기를 원하기 때문에 할당되기 전에 유효성을 검사해야합니다.

아이디어 또 다른 approch이 될 것 2

만들거나 필요에 따라 myObject의 달력 개체를 수정하려면 날짜 또는 시간 설정시 : 여기

@Column(name = "begin") 
@Temporal(TemporalType.TIMESTAMP) 
private Calendar begin; 

public void setBeginDate(String value) 
{ 
    // assign a new calendar object to "begin", if "begin" is null 
    // set only day, month and year components on this calendar object 
} 

public void setBeginTime(String value) 
{ 
    // see "setBeginDate", do the same with hours and minutes 
} 

문제, 즉 "date"또는 "time"필드 중 하나만 유효한 경우 새 달력 객체가 만들어집니다. 보기의 필드가 현재 날짜 또는 현재 시간으로 채워집니다 (올바른 값에 따라 다름)

isValidDate -flag를 모델에 추가하여이 문제를 해결할 수도 있습니다. 그러나 이것은 이것이 부정한 해결책이라고 생각합니다.

결론

내가 실제 모델 객체와 컨트롤러에 대한 myObjectmyObject 사이에 큰 차이가 있다고 생각합니다. myObject은 유효성을 검사하고 "매핑"되는 즉시 모델 객체 여야합니다. 그래서 여기

내 질문 : 당신은 마지막 점은 일반적으로 나쁜 생각으로 @ModelAttribute를 사용하여 알 수 있다는

  • 을 생각하십니까?
  • MyObject - 인스턴스가 생성되기 전에 양식 데이터를 매핑하고 유효성을 검사하는 방법이 있습니까?
  • 그렇지 않은 경우 어떻게 문제를 해결 하시겠습니까?

답변

0

편집 : @initBinder 다른 방법은 주위 OK입니다 - 프레임 워크는 당신이 원하는 것을 할 수 있다면

내가 모르는 (1 개 필드> N 속성) (N 필드 -> 1 개 속성) 바인딩 배관에 들어가기없이 상자 밖으로.

여기에 문제를 해결하기 위해 두 가지 간단한 솔루션입니다 :

  • 가 그것에게 오래된 "스트럿"방법을 수행하고보기에 독점적으로 사용하는 MyObjectForm 객체를 만든 다음에 그것을 변환하여 컨트롤러는 MyObject입니다. 기술적으로 소리가 나는 MyObjectService 서비스 레이어에서 여전히 @Valid을 사용할 수 있습니다.

  • MyObject에 수십 개의 속성이 포함되지 않은 경우 @ModelAttribute + 컨트롤러 레이어 유효성 검사를 잊어 버리고 각 입력란에 @RequestParam을 사용하면됩니다. 서비스 계층 유효성 검사는 여전히 진행 중입니다.

당신은 확실히 훨씬 더 혼란에 당신은 "바인딩"수동 스프링 MVC의 내부 기능을 사용하여 객체에 대한 양식 데이터, 그러나이 결국 내 2 점 같은 것 할 수 무언가를 해킹 할 수 연관.

+0

PropertyEditor는 한 필드에서 작동하며 두 필드, 날짜 및 시간을 모두 지원하는 방법을 알지 못합니다. – fishbone

+0

죄송합니다. 첫 번째 대답에서이 방법이 잘못되었습니다. –