2009-04-25 4 views
0

나는 이것을 올바르게 설명 할 수 있기를 바란다. Spring을 사용하여 Liferay 용 포틀릿을 개발 중입니다. 그것은 핀 보드 시스템입니다. 그래서 나는 id (id)를 가진 특정 pinboard 엔트리의 세부 사항을 보여주는 view (jsp)를 가지고있다. 또한 사용자가 현재보고있는 핀 보드 항목에 새 주석을 추가하는 AddCommentController 링크가 있습니다. AddCommentController 봄의 SimpleFormController 같은를 확장하고 또한 부착 된 검증 있습니다Validator가있는 Spring SimpleFormController에 요청 파라미터를 유지

<bean id="addCommentController" class="com.lifepin.controllers.AddCommentController" parent="lifePinControllerTemplate"> 
    <property name="formView" value="addComment" /> 
    <property name="successView" value="viewEntryDetail" /> 
    <property name="validator" ref="commentValidator"/> 
</bean> 

유효성 검사기는 정말 간단을 다음과 같이 보입니다 : 사용자가 자신의 코멘트를 입력 할 수 있습니다

이제
public class CommentValidator implements Validator { 

    public boolean supports(Class clazz) { 
     return clazz.equals(Comment.class); 
    } 

    public void validate(Object obj, Errors validationError) { 
     ValidationUtils.rejectIfEmptyOrWhitespace(validationError, "content", "err.content.empty", "This value is required"); 
    } 

} 

뷰 두 가지가 있습니다 버튼을 클릭하고 저장하고 취소합니다. 다음은 URL에 따른 두 개의 생성자입니다. AddCommentController의 onSubmitAction에서

<portlet:actionURL var="actionUrl"> 
    <portlet:param name="action" value="addComment"/> 
    <portlet:param name="pinboardEntryId" value="${param.pinboardEntryId}"/> 
</portlet:actionURL> 

<portlet:renderURL var="cancelUrl"> 
    <portlet:param name="action" value="viewPinboardEntry"/> 
    <portlet:param name="pinboardEntryId" value="${param.pinboardEntryId}"/> 
</portlet:renderURL> 

는 I 파라미터 (상기 첫번째 actionURL 참조)가 ActionResponse의 s.t.로 전달 독출 핀 보드 항목의 상세보기에서 항목을 다시로드하여 표시 할 수 있습니다.

public class AddCommentController extends SimpleFormController{ 
    ... 
    @Override 
    protected void onSubmitAction(ActionRequest request, ActionResponse response, Object command, BindException bindException) 
      throws Exception { 

     long pinboardEntryId = PortletRequestUtils.getLongParameter(request, ParameterNameConstants.PINBOARDENTRY_ID, -1); 
     ... 
    } 
    ... 
} 

유효성 검사 오류가 발생하는 경우를 제외하고 모두 정상적으로 작동합니다. 이 경우 URL에서 "pinboardEntryId"매개 변수가 느슨해지며, PortletRequest 또는 응답이 없으므로 CommentValidator에서 해당 매개 변수를 다시 읽어 응답에 전달할 수있는 방법이 없습니다.

지금은 세션에 ID를 저장하고 거기에서 검색하여이 문제를 해결했습니다. 그러나 일부 사용자가 세션을 사용하지 않고도 대체 솔루션을 가지고 있는지 묻고 싶었습니다. 나는 하나 있다고 확신한다. 다시 호출되는 showForm(..) 유효성 검사 오류에

감사합니다,
주리

답변

0

Oliver Gierke (피드백에 대한 감사)가 제안한 showForm (..) 접근 방식을 처음 시도했지만 예상대로 작동하지 않았습니다. showForm (..)은 onSubmitAction (...)에 의해 처리되어야하기 때문에 신경 쓰고 싶지 않은 새로운 ModelAndView를 반환하려고합니다.

올바른 접근 방식은 필요한 모든 정보를 사용할 수, 거기

@Override 
protected void processFormSubmission(ActionRequest request, ActionResponse response, Object command, BindException errors){ 
    ... 
} 

을 무시하는 것입니다. errors.hasErrors()을 사용하여 유효성 검사 오류가 있었는지 여부를 BindingException에서 확인할 수 있습니다. 그렇다면 필요한 매개 변수를 읽고 응답에 전달하여 양식에 다시 넣을 수 있습니다. 그렇지 않으면 나는 단지 onSubmitAction(..)이라고 부르며 요청, 응답 등과 같은 필요한 매개 변수를 전달합니다. processFormSubmission에서 사용할 수 있습니다.

0

. 이 방법을 덮어 쓰고 RequestResponse을 원하는대로 조작 할 수 있습니다.

4

더 쉬운 방법은 renderParameters 속성을 설정하는 것입니다. renderParameters 속성은 SimpleFormController가 항상 전달할 매개 변수 이름의 배열입니다. 예 :

<bean id="addCommentController" class="..."> 
     .... 
     <property name="renderParameters"> 
      <list> 
      <value>pinboardEntryId</value> 
      </list> 
     </property> 
    </bean> 

이렇게하면 'pinboardEntryId'매개 변수가 추가 코드없이 매번 전달됩니다.

+0

멋진데, 이미 프로젝트를 마쳤지 만, 힌트를 위해 thx. – Juri

관련 문제