0

初心者から春のMVCまでの合計。springmvcフレームワークに編集フォームを事前入力する必要があります。

contact_edit.jsp

<form:form method="post" action="edit/1" commandName="contact">
<% Contact contact = (Contact)request.getAttribute("contact");  %>
    <table>

        <tr>
            <td><form:label path="firstname">
                    <spring:message code="label.firstname" />
                </form:label></td>
            <td><form:input path="firstname" value="<%=contact.getFirstname() %>"/></td>
        </tr>
        <tr>
            <td><form:label path="lastname">
                    <spring:message code="label.lastname" />
                </form:label></td>
            <td><form:input path="lastname" value="<%=contact.getLastname() %>"/></td>
        </tr>
        <tr>
            <td><form:label path="email">
                    <spring:message code="label.email" />
                </form:label></td>
            <td><form:input path="email" value="<%=contact.getEmail()%>" /></td>
        </tr>
        <tr>
            <td><form:label path="telephone">
                    <spring:message code="label.telephone" />
                </form:label></td>
            <td><form:input path="telephone" value="<%=contact.getTelephone()%>"/></td>
        </tr>
        <tr>
            <td colspan="2"><input type="submit"
                value="<spring:message code="label.addcontact"/>" /></td>
        </tr>
    </table>
</form:form>

このページを取得するためのコントローラーコード:

@RequestMapping(value = "/edit/{contactId}", method = RequestMethod.GET)
public ModelAndView edit(@PathVariable("contactId") Integer contactId,
        HttpServletRequest request) {
    System.out.println("I was here");
    Contact contact = contactService.getContact(contactId);
    request.setAttribute("contact", contact);
    Map<String, Object> model = new HashedMap();
    model.put("contact", contact);

    return new ModelAndView("contact_edit", model);
}

私の例外:

org.springframework.beans.InvalidPropertyException: Invalid property 'firstname' of bean class [net.viralpatel.contact.form.Contact_$$_javassist_0]: Getter for property 'firstname' threw exception; nested exception is java.lang.reflect.InvocationTargetException
org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:845)
org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:721)
org.springframework.validation.AbstractPropertyBindingResult.getActualFieldValue(AbstractPropertyBindingResult.java:99)
org.springframework.validation.AbstractBindingResult.getFieldValue(AbstractBindingResult.java:219)
org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:120)
org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.java:178)
org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getPropertyPath(AbstractDataBoundFormElementTag.java:198)
org.springframework.web.servlet.tags.form.LabelTag.autogenerateFor(LabelTag.java:129)
org.springframework.web.servlet.tags.form.LabelTag.resolveFor(LabelTag.java:119)
org.springframework.web.servlet.tags.form.LabelTag.writeTagContent(LabelTag.java:89)
org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.java:102)
org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:79)
org.apache.jsp.WEB_002dINF.jsp.contact_005fedit_jsp._jspx_meth_form_005flabel_005f0(contact_005fedit_jsp.java:320)
org.apache.jsp.WEB_002dINF.jsp.contact_005fedit_jsp._jspService(contact_005fedit_jsp.java:147)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:433)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:389)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:333)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:238)
org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:262)
org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1180)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:950)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

root cause

  java.lang.reflect.InvocationTargetException
  sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:601)
org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:761)
org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:721)
org.springframework.validation.AbstractPropertyBindingResult.getActualFieldValue(AbstractPropertyBindingResult.java:99)
org.springframework.validation.AbstractBindingResult.getFieldValue(AbstractBindingResult.java:219)
org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:120)
org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.java:178)
org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getPropertyPath(AbstractDataBoundFormElementTag.java:198)
org.springframework.web.servlet.tags.form.LabelTag.autogenerateFor(LabelTag.java:129)
org.springframework.web.servlet.tags.form.LabelTag.resolveFor(LabelTag.java:119)
org.springframework.web.servlet.tags.form.LabelTag.writeTagContent(LabelTag.java:89)
org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.java:102)
org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:79)
org.apache.jsp.WEB_002dINF.jsp.contact_005fedit_jsp._jspx_meth_form_005flabel_005f0(contact_005fedit_jsp.java:320)
org.apache.jsp.WEB_002dINF.jsp.contact_005fedit_jsp._jspService(contact_005fedit_jsp.java:147)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:433)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:389)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:333)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:238)
org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:262)
org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1180)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:950)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:852)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:882)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:778)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
javax.servlet.http.HttpServlet.service(HttpServlet.java:722)

私の連絡先クラス:

@Entity
@Table(name="CONTACTS")
public class Contact {

@Id
@Column(name="ID")
@GeneratedValue
private Integer id;

@Column(name="FIRSTNAME")
private String firstname;

@Column(name="LASTNAME")
private String lastname;

@Column(name="EMAIL")
private String email;

@Column(name="TELEPHONE")
private String telephone;


public String getEmail() {
    return email;
}
public String getTelephone() {
    return telephone;
}
public void setEmail(String email) {
    this.email = email;
}
public void setTelephone(String telephone) {
    this.telephone = telephone;
}
public String getFirstname() {
    return firstname;
}
public String getLastname() {
    return lastname;
}
public void setFirstname(String firstname) {
    this.firstname = firstname;
}
public void setLastname(String lastname) {
    this.lastname = lastname;
}
public Integer getId() {
    return id;
}
public void setId(Integer id) {
    this.id = id;
}

}

私のContactクラスには、すべてのgetterメソッドとsetterメソッドが含まれていますが、createフォームも正常に機能しています。何が問題を引き起こしているのか理解できません。すでにリクエストとModelAndViewクラスに連絡先オブジェクトを挿入しました。!!! ?? !!

4

4 に答える 4

1

spring-servlet.xmlではなくapplicationContext.xmlでsessionFactoryを初期化することで、これを解決しました。そして、必ずspring-servlet.xmlから削除してください。

于 2012-09-23T14:54:15.360 に答える
0

問題はモデルクラスにあると思います。モデルにゲッター/セッターメソッドがfirstnameありますか?はいの場合は、コードを追加して詳細を調査してください

于 2012-09-12T03:59:28.843 に答える
0

ゲッターを明示的に呼び出す必要はありません。スプリングフォームタグを使用しているため、スプリングはフォームに自動的に入力されます。

編集:

@RequestMapping(value = "/edit/{contactId}", method = RequestMethod.GET)
public ModelAndView edit(@PathVariable("contactId") Integer contactId) {
    System.out.println("I was here");
    Contact contact = contactService.getContact(contactId);
    return new ModelAndView("contact_edit","contact", contact);
}

この行を置き換えてみてください

Contact contact = contactService.getContact(contactId);

Contact contact = new Contact();

問題の原因を突き止めるためだけに

于 2012-09-12T04:21:47.427 に答える
0

コードで修正することがいくつかあります。

1)ドメインオブジェクトをモデルに追加すると、SpringMVCはそれらをJSPで利用できるようにします。リクエストでドメインオブジェクトを再度設定する必要はありません。したがって、コントローラーから以下を削除します。

request.setAttribute("contact", contact);

同様に、jspでリクエストオブジェクトを参照する必要はありません。削除します

Contact contact = (Contact)request.getAttribute("contact");

2)Springのフォームタグの「commandName」属性を使用してフォームバッキングドメインオブジェクトを設定すると、Springはドメインオブジェクトのプロパティを使用してフォーム要素の値を設定/取得します。

たとえば、次のコードでは、Springは、フォームの入力/送信中に連絡先の名プロパティにgetter/setterを使用します。

<form:form method="post" action="edit/1" commandName="contact">
    <form:input path="firstname"/>
</form>

ドメイン/フォームベイキングオブジェクトから使用する必要のあるすべてのプロパティにgetter/setterが実装されていることを確認してください。

于 2012-09-12T04:34:54.967 に答える