【问题标题】:Spring Object conversion [duplicate]Spring对象转换[重复]
【发布时间】:2017-12-21 04:05:48
【问题描述】:

我正在处理 Spring MVC 项目 spring 无法转换我的 Post 对象所需的用户对象。

我的 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.lang.String 类型的属性值转换为属性用户所需的 com.sg.sophacms.Model.User 类型;嵌套异常是 java.lang.IllegalStateException:无法将 java.lang.String 类型的值转换为属性用户所需的 com.sg.sophacms.Model.User 类型:找不到匹配的编辑器或转换策略

【问题讨论】:

  • @Rnhep,在从 UI 对控制器进行 POST 调用期间是否发生此异常?
  • 你的 JSP 是什么?您是否尝试将其绑定到文本字段?如果是这样,您将需要像 PropertyEditor 和 getAsText/setAsText 这样的转换策略。看到这个线程:stackoverflow.com/questions/912257/…
  • @Kumar。是的。这发生在对 newPost 方法的 POST 调用期间。提交表单时。
  • @geneb。我总得发布 JSP。生病把它快点。是的,我的输入字段是一个文本字段。
  • @Rnhep 此异常是因为用户对象将其作为字符串从 UI 中生成。您可以删除该字段的 type=“text” 并重试吗?

标签: java spring spring-mvc


【解决方案1】:

在您的控制器中覆盖initBinder(或使用@InitBinder 注释任何方法)并为User 类和字段名称“user”提供PropertyEditor(尽管它可以用于此的任何字段类)与getAsText/setAsText:

@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
        }
    });
}

这个想法是你需要指定逻辑来翻译 ObjectString。在上面的示例中,我假设您可以从字符串构造User(str),并且User.getId() 将返回一个字符串。这是您需要将对象绑定到文本字段的对象字符串翻译策略的示例。

【讨论】:

  • 谢谢,我还在学习java和spring MVC,所以我确定如何构造User(str),我是否将这个方法调用到我的JSP?
  • 您不需要更改 JSP——它可以像现在一样拥有输入文本路径。 SpringMVC 服务器端需要像我展示的那样注册 PropertyEditor。如果您想从字符串中获取 User obj,那么您将如何构造 obj?这就是为什么我展示了一个 User(str) 构造函数。绑定到 String 的文本字段是自动的,但绑定到 Object 需要您指定的某种转换。
猜你喜欢
  • 2014-05-07
  • 2013-07-26
  • 2015-01-02
  • 2014-07-29
  • 2012-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多