스프링 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를 모델에 추가하여이 문제를 해결할 수도 있습니다. 그러나 이것은 이것이 부정한 해결책이라고 생각합니다.
결론
내가 실제 모델 객체와 컨트롤러에 대한 myObject
과 myObject
사이에 큰 차이가 있다고 생각합니다. myObject
은 유효성을 검사하고 "매핑"되는 즉시 모델 객체 여야합니다. 그래서 여기
내 질문 : 당신은 마지막 점은 일반적으로 나쁜 생각으로 @ModelAttribute
를 사용하여 알 수 있다는
- 을 생각하십니까?
MyObject
- 인스턴스가 생성되기 전에 양식 데이터를 매핑하고 유효성을 검사하는 방법이 있습니까?- 그렇지 않은 경우 어떻게 문제를 해결 하시겠습니까?
PropertyEditor는 한 필드에서 작동하며 두 필드, 날짜 및 시간을 모두 지원하는 방법을 알지 못합니다. – fishbone
죄송합니다. 첫 번째 대답에서이 방법이 잘못되었습니다. –