2012-01-07 32 views
0

私の「コメント」(DAOに格納された)オブジェクトをコントローラから取得してJSPに表示する必要がありますが、エラーブロックからエラーメッセージが表示されるたびに表示されます。jQueryポストはjsonとしてエンティティオブジェクトを取得できません

なぜこのようなことが起こっているのですか?私のコードの

ロジックは次である:

  1. フォームから「返信」ボタンデータをクリックした後、私のコントローラに送信されます。
  2. コントローラはデータをDBに保存し、「コメント」エンティティを返します。
  3. 私はこの「コメント」エンティティをJSPページに入れ、ページに公開するためにこのエンティティを使用します。

しかし、私は成功ブロックからmsgの代わりにエラーブロックからエラーmsgを受け取ります。ここで

は私のフォームである:ここでは

<form id="comment_${comment.getCommentId()}"> 
    <textarea class="textarea" rows="10" name="text"></textarea> 
    <input type="hidden" name="bookId" value="${book.getBookId()}" /> 
    <input type="hidden" name="parentId" /> 
    <input type="hidden" name="commentId" value="${comment.getCommentId()}" /><br /> 
    <input type="button" class="button" value="Reply" id="submit_${comment.getCommentId()}" onclick="ajaxsubmit(this.id)"/> 
</form> 

は私のスクリプトです:

:ここ

<script type="text/javascript"> 
    function ajaxsubmit(buttonId){ 
    var formId = document.getElementById(buttonId).parentNode.id; 
    var dataString = $("#" + formId).serialize(); 

    $.ajax({ 
     url: "ajaxcomment.htm", 
     type: "post", 
     data: dataString, 
     dataType: "json", 
     success: function(data) { 
      alert(data.getCommentAdded()); 
     }, 
     error: function() { 
      alert("error"); 
     } 
    }); 
} 

は私のコントローラここ

@RequestMapping(value = "ajaxcomment.htm", method = RequestMethod.POST) 
public @ResponseBody Comment ajaxcomment(
     HttpServletRequest httpServletRequest, 
     @RequestParam(value = "bookId", required = false) Long bookId, 
     @RequestParam(value = "parentId", required = false) Long parentId, 
     @RequestParam(value = "commentId", required = false) Long commentId, 
     @RequestParam(value = "text", required = true) String text) { 

    String username = httpServletRequest.getRemoteUser(); 
    User user = userDao.getUserByUsername(username); 

    Comment comment = new Comment(); 

    // DAO logic 

    commentDao.addComment(comment); 
    return comment; 
} 

が私の 'コメント' のエンティティです

@Entity @Table(name = "COMMENT") public class Comment implements Serializable { 

@Id 
@GeneratedValue 
@Column(name = "COMMENT_ID", nullable = false) 
private Long commentId; 

@Column(name = "COMMENT_TEXT", length = 512, nullable = true) 
private String commentText; 

@Column(name = "COMMENT_ADDED", length = 128, nullable = true) 
@Temporal(TemporalType.TIMESTAMP) 
private Date commentAdded; 

@ManyToOne(cascade = CascadeType.REFRESH, fetch = FetchType.EAGER) 
@JoinColumn(name = "BOOK_ID") 
private Book book; 

@ManyToOne(cascade = CascadeType.REFRESH, fetch = FetchType.EAGER) 
@JoinColumn(name = "PARENT_ID") 
private Comment parentComment; 

@OneToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER, mappedBy = "parentComment") 
@OrderBy("commentAdded") 
private Collection<Comment> subcomments; 

public void setCommentText(String commentText) { 
    this.commentText = commentText; 
} 
public String getCommentText() { 
    return this.commentText; 
} 

// other getters and setters are public too 

そして、ここで私のapplicationContext.xmlを次のとおりです。

<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:mvc="http://www.springframework.org/schema/mvc" 
xmlns:context="http://www.springframework.org/schema/context" 
xsi:schemaLocation="http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-2.5.xsd 
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
    http://www.springframework.org/schema/mvc 
    http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd"> 

<mvc:annotation-driven /> 
<context:component-scan base-package="com.demo"/> 
<context:component-scan base-package="com.demo.service"/> 
<context:annotation-config /> 


<bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver"> 
    <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/> 
    <property name="prefix" value="/WEB-INF/jsp/"/> 
    <property name="suffix" value=".jsp"/> 
</bean> 

<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/> 

<bean id="jacksonMessageConverter" class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/> 

<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> 
    <property name="messageConverters"> 
     <list> 
      <ref bean="jacksonMessageConverter" /> 
     </list> 
    </property> 
</bean> 

<bean id="exceptionMessageAdapter" 
    class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver"> 
    <property name="messageConverters"> 
     <list> 
      <!-- Support JSON --> 
      <ref bean="jacksonMessageConverter" /> 
     </list> 
    </property> 
</bean> 

答えて

0

これは機能します。

私は私のコントローラメソッド(ハンドラ)更新しました:JSON.parse()のみ'param':'value'"param":"value"のような文字列を解析していないので、私は '\を使用」の代わりに

@Autowired private DAOComment commentDao; 

@RequestMapping(value = "ajaxcomment.htm", method = RequestMethod.POST) 
public @ResponseBody String ajaxcomment(
    HttpServletRequest httpServletRequest, 
    @RequestParam(value = "bookId", required = false) Long bookId, 
    @RequestParam(value = "parentId", required = false) Long parentId, 
    @RequestParam(value = "commentId", required = false) Long commentId, 
    @RequestParam(value = "text", required = true) String text) { 

String username = httpServletRequest.getRemoteUser(); 
User user = userDao.getUserByUsername(username); 

Comment comment = new Comment(); 

// DAO logic 

commentDao.addComment(comment); 
return "{\"id\":\"" + comment.getCommentId() + "\"," + 
    "\"username\":\"" + comment.getUser().getUsername() + "\"," + 
    "\"text\":\""  + comment.getCommentText() + "\"," + 
    "\"added\":\""  + comment.getFormattedDate() + "\"}"; 
} 

更新スクリプト:。

<script type="text/javascript"> 
    function ajaxsubmit(buttonId, className){ 
     var formId = document.getElementById(buttonId).parentNode.id; 
     var dataString = $("#" + formId).serialize(); 
     $.ajax({ 
      url: "ajaxcomment.htm", 
      type: "post", 
      data: dataString, 
      dataType: "text", 
      success: function(data) { 
       var response = JSON.parse(data); 

       //This's it. 
       alert(response.id); 

      }, 
      error: function() { 
       alert("Error has occured."); 
      } 
     }); 
    } 
</script> 
0

それはあなたのフォームにあなたがvalue="${book.getBookId()}"代わりのvalue="${book.bookId}"のような値を設定していることかもしれません。

つまり、フィールドのゲッターを直接使用するのではなく、Bean内のフィールドの名前(エンティティなど)を参照して式言語を使用する必要があります。

+0

私は知っていますが、「コメント」エンティティのすべてのフィールドはプライベートです – Dmytro

+0

しかし、あなたは公開ゲッターを持つことができます – Fortunato

+0

ゲッタとセッタはすべて公開されています。 – Dmytro