2017-10-16 16 views
0

빌더 패턴을 처음 사용하고 스프링 모델에서 빌더 패턴을 사용하는 방법을 알아 내려고합니다.스프링 @ModelAttribute를 빌더 패턴과 함께 사용하는 방법

내 이전 모델은 내가 빌더 방법으로 대체하고, 이제 코드는 다음과 같이 보이는 모든 세터와 게터 방법이 있었다 : 나는 UI에서 사용자 interestlevel을 복용 한 빌더없이

public class UserInterests { 
    private final String user; 
    private final int interestlevel; 

    private UserInterests(UserInterestBuilder builder) { 
     this.user = builder.user; 
     this.interestlevel = builder.interestlevel; 
    } 

    public String getUser() { 
     return user; 
    } 

    public static class UserInterestBuilder { 
     private String user; 
     private int interestlevel; 

     public UserInterestBuilder() { 
     } 

     public UserInterestBuilder user(final String userId) { 
      this.user = user; 
      return this; 
     } 

     public UserInterestBuilder interestLevel(final int interestLevel) { 
      this.interestLevel = interestLevel; 
      return this; 
     } 

     public UserInterests build() { 
      return new UserInterests(this); 
     } 
    } 
} 

이전을, (JSP로) 그것을 UserInterests 모델에 바인딩했습니다. 컨트롤러에서 @ModelAttribute를 사용하여 UserInterests의 인스턴스를 가져 와서 사용하고있었습니다. 나는이의 생성자는 개인이기 때문에, 내가 userInterests에게 모델 인스턴스를 사용할 수 없습니다 빌더를 사용하여 모델을 변경하기 때문에,

@RequestMapping(value = "/addInterest", method = RequestMethod.POST) 
public ModelAndView addUserInterest(
     @ModelAttribute(USER_INTEREST) UserInterests userInterests, 
     BindingResult result, HttpSession session, ModelAndView model) { 
//do something here 
} 

JSP가

<html> 
<head></head> 
<body> 
    <form:form modelAttribute="userInterests" action="addInterest" 
method="post"> 
<!-- Do more --> 
</body> 
</html>       

니펫을하지만 :

는 컨트롤러 니펫을. request.getParameter()를 사용하여 사용자 및 interestlevel 값을 별도로 가져올 수 있으며 build를 사용하여 userInterests 모델에 바인딩 할 수 있습니다. 그러나 값을 별도로 가져와야하는 빌더를 위해 @ModelAttribute를 직접 사용할 수있는 방법이 있습니다.

도움이 될 것입니다.

답변

0

주석은 ModelAttributeMethodProcessor으로 처리되고 속성은 서블릿 요청 매개 변수에 대한 데이터 바인딩을 통해 채워집니다. DataBinder의 내장 Witthin 실제로는 가장 일반적인 속성 접근이 BeanWrapperImpl 보면

protected void applyPropertyValues(MutablePropertyValues mpvs) { 
     try { 
      // Bind request parameters onto target object. 
      getPropertyAccessor().setPropertyValues(mpvs, isIgnoreUnknownFields(), isIgnoreInvalidFields()); 
     } 
     catch (PropertyBatchUpdateException ex) { 
      // Use bind error processor to create FieldErrors. 
      for (PropertyAccessException pae : ex.getPropertyAccessExceptions()) { 
       getBindingErrorProcessor().processPropertyAccessException(pae, getInternalBindingResult()); 
      } 
     } 
    } 

바인딩, 그 이외에 스프링 패키지에서 기본 property editors를 자동 등록하는 기본 기능이 수행 방법을 따르고있다 JDK의 표준 PropertyEditors이므로 기본적으로 JavaBeans (기본적으로 속성 및 특수 명명 규칙이있는 접근 자)과 완전히 연결되어 있으므로 빌더 패턴과 같은 다른 스타일을 지원하지 않습니다.

+0

그래서 내 의존성 주입과 함께 빌더 패턴을 사용하는 방법이 있습니까? –

+0

자동 데이터 바인딩 기능을 원하면 그럴 수 없습니다. 빌더 API를 사용하여 modelAtribute를 다른 객체로 수동으로 변환해야합니다. – Shailendra

0

빌더를 사용하여 UserInterests를 주입하려면 요청을 조사하고 UserInterestBuilder를 사용하여 UserInterests의 인스턴스를 제공하는 자체 HandlerMethodArgumentResolver을 작성할 수 있습니다. 특히, 나는 그것을 조금 강요하고이 시나리오는 매개 변수를 바인딩하기 위해 Command 나 Form 객체를 사용하여 객체를 생성함으로써보다 단순해질 수있다.