2017-12-21 9 views
0

Spring MVC 프로젝트에서 Spring에서 작업 중입니다. Post 객체에 필요한 사용자 객체를 변환하지 못했습니다. Spring 객체 변환

내 NewPost 개체 :

public class NewPost { 

private int postId; 
@NotEmpty(message ="Title must not be empty!") 
@Length(max = 50, message="Title must be less then 50 character") 
private String title; 
@NotEmpty(message ="Comment must not be empty!") 
private String content; 
@Length(max = 100, message="must be less then 100 character") 
private String imagePath; 
@DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) 
private LocalDateTime publishDate; 
private User user; 

내 컨트롤러 :

//Get lates post from DB. 
    @RequestMapping(value = "/displayBlogPage", method = RequestMethod.GET) 
    public String displayLatesPost(Model model) { 
    List<NewPost> displayAllPost = new ArrayList<>(); 
    displayAllPost = NPDao.getAllPost(); 
    model.addAttribute("displayAllPost", displayAllPost); 

    //get newPost to the model. 
    model.addAttribute("newPost", new NewPost()); 

    //get user object to the model 
    model.addAttribute("user", userDao.getUserbyId(1)); 

    LocalDateTime timeStamp = LocalDateTime.now(); 
    model.addAttribute("timeStamp", timeStamp); 

    return "NewPostPage"; 

} 
//for add Post form 
    @RequestMapping(value = "/newPost", method = RequestMethod.POST) 
    public String createPost(@Valid @ModelAttribute("newPost") NewPost newPost, BindingResult result) { 

if(result.hasErrors()){ 
    return "NewPostPage"; 
} 
    NPDao.addNewPost(newPost); 

    return "redirect:NewPostPage"; 
} 

내 JSP 여기

<sf:form class="form-horizontal" 
role="form" method="POST" 
action="newPost" modelAttribute="newPost" > 
<div class="col-md-12"> 
<div class="form-group"> 
<div class="col-md-6"> 
<sf:input type="text" class="form-control" path="title" placeholder="title" /> 
<sf:errors path="title" cssclass="error" ></sf:errors> 
</div> 
</div> 
<div class="form-group"> 
<div class="col-md-6"> 
<sf:input type="text" class="form-control" path="imagePath" placeholder="image" /> 
<sf:errors path="imagePath" cssclass="error" ></sf:errors> 
<sf:input type="text" class="form-control" path="publishDate" placeholder="date" value="${timeStamp}" /> 
<sf:errors type="date" path="publishDate" cssclass="error" ></sf:errors> 
<sf:input type="text" class="form-control" path="user" placeholder="user" value="${user}"/> 
<sf:errors path="user" cssclass="error" ></sf:errors> 
<sf:input type="text" class="form-control" path="postId" placeholder="postid"/> 
<sf:errors path="postId" cssclass="error" ></sf:errors> 
<div class="form-group"> 
<div class="col-md-12"> 
<textarea type="text" class="form-control comment" name="comment" placeholder="Comment" required ></textarea> 
<input type="submit" id="add"class="btn btn-default" value="Submit Post"/> 
</div> 
</div> 
</div> 
</sf:form> 

예외입니다 :

유형의 속성 값을 변환하는 데 실패 java.l 필수입니다. com.sg.sophacms.Model.User to property user; 중첩 예외가 java.lang.IllegalStateException : java.lang.String 유형의 값을 등록 정보 사용자의 필수 유형 com.sg.sophacms.Model.User로 변환 할 수 없습니다. 일치하는 편집기 또는 변환 전략이 없습니다.

+0

@Rnhep,이 예외는 UI에서 POST 호출 중에 발생합니다. – Kumar

+0

JSP 란 무엇입니까? 텍스트 필드에 바인딩하려고합니까? 그렇다면 PropertyEditor 및 getAsText/setAsText와 같은 변환 전략이 필요합니다. 이 스레드를 참조하십시오 : https://stackoverflow.com/questions/912257/converting-from-string-to-custom-object-for-spring-mvc-form-data-binding –

+0

@ 쿠마. 예. 이것은 newPost 메소드에 대한 POST 호출 중에 발생했습니다. 양식 제출시. – Rnhep

답변

0

컨트롤러 무시 initBinder (또는 @InitBinder있는 모든 방법을 주석) 및 getAsText/setAsText을 가지는 클래스 User 및 필드 이름 "user"(이것은이 클래스의 모든 필드이 될 수 있지만)에 대한 PropertyEditor 제공 : 아이디어는 당신이 필요하다

@Override 
protected void initBinder(HttpServletRequest request, ServletRequestDataBinder binder) throws Exception { // or @InitBinde 
    binder.registerCustomEditor(User.class, "user", new PropertyEditorSupport() { 
     @Override 
     public void setAsText(String text) { 
      User user = new User(text); // Some kind of initialization of your object from string 
      setValue(user); 
     } 

     @Override 
     public String getAsText() { 
      User user = getValue(); 
      return user.getId(); // Some kind of string from your User object 
     } 
    }); 
} 

을 Object < -> String을 번역 할 논리를 지정하십시오. 위의 예에서 문자열에서 User(str)을 생성 할 수 있다고 가정하고 User.getId()은 문자열을 반환합니다. Object < -> 텍스트 필드에 개체를 바인딩하는 데 필요한 문자열 변환 전략의 예입니다.

+0

고맙다. 나는 여전히 자바와 스프링 MVC를 배웠다. 그래서 User (str)를 생성하는 방법을 확신하고이 메소드를 내 JSP로 호출 할까? – Rnhep

+0

JSP를 변경할 필요가 없습니다 - 이제는 입력 텍스트 경로를 가질 수 있습니다. SpringMVC 서버 측에서는 내가 보여준대로 PropertyEditor를 등록해야합니다. 문자열에서 User obj를 얻고 싶다면 obj를 어떻게 만들겠습니까? 그게 내가 User (str) 생성자를 보여준 이유이다. String에 바인딩 된 텍스트 필드는 자동이지만 Object에 지정하는 일종의 변환이 필요합니다. –