web-dev-qa-db-ja.com

クライアントから送信されたリクエストは構文的に正しくありませんでした。-SpringMVC + JDBC Template

私はSpring MVCの初心者です。プロジェクトの実行中にエラーが発生しましたエラー-クライアントから送信されたリクエストは構文的に正しくありませんでした。エンティティクラスPatientInfoがあります。私のjspページはdemo1です。私のコントローラーは患者コントローラーです。私が実装したい機能は、データベースへの値の挿入です。しかし、コントローラーで関数(add-update2)を呼び出すことができません。

demo1.jsp

        <%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<html>
<head>
<title>Registration Form</title>
</head>
<body>
<h2 align="center">Full Registration Form</h2>
<hr />
<table align="center" cellpadding="5" cellspacing="5">
    <form:form modelAttribute="patientInfo" method="POST" action="add-update2">
            <tr>
            <td> First Name</td>
            <td><form:input path="firstName"/></td>
        </tr>
               <tr>
            <td>Middle Name</td>
            <td><form:input path="middleName" /></td>
        </tr>
        <tr>
            <td>Last Name</td>
            <td><form:input path="lastName"/>
            </td>
        </tr>
                <tr>
            <td>Age</td>
            <td><form:input path="age" /></td>
        </tr>
                <tr>
            <td>Gender</td>
            <td><form:select path="gender">
                <form:option value="" label="Select Gender" />
                <form:options items="${genderList}" itemLabel="gender" itemValue="gender" />
            </form:select></td>
        </tr>
                <tr>
                    <td>Marital Status</td>
                    <td><form:select path="maritalStatus">
                            <form:option value="" label="Select Marital Status" />
                            <form:options items="${maritalList}" itemLabel="maritalstatus" itemValue="maritalstatus" />
                        </form:select></td>
                </tr>
                  <tr>
            <td>Nationality</td>
            <td><form:select path="nationality">
                <form:option value="" label="Select Nationality" />
                <form:options items="${nationalityList}" itemLabel="country" itemValue="country" />
            </form:select></td>
        </tr>
                 <tr name="tstest">
                     <td>Date Of Birth</td>
                     <td><form:input path="dateOfBirth" name="timestamp" value=""/>
<a href="javascript:show_calendar('document.tstest.timestamp', document.tstest.timestamp.value);"><img src="../images/cal.gif" width="16" height="16" border="0" alt="Click Here to Pick up the timestamp"></a>
                     </td>
                 </tr>
<tr>
    <td>E-mail</td>
    <td><form:input path="email"/></td>
</tr>
            <tr>
            <td>Blood Group</td>
            <td><form:select path="bloodGroup">
                <form:option value="" label="Select Blood Group" />
                <form:options items="${bloodList}" itemLabel="bloodgroupname"     itemValue="bloodgroupname" />
            </form:select></td>
        </tr>
                <tr>
            <td><input type="submit"  value="submit"/></td>
        </tr>

    </form:form>
</table>
</body>
</html>

Controller-PatientController.Java

package com.app.ehr.api;
import com.app.ehr.domain.Bloodgroup;
import com.app.ehr.domain.Gendertype;
import com.app.ehr.entities.Patientinfo;
import com.app.ehr.domain.Maritalstatus;
import com.app.ehr.domain.Nationality;
import com.app.ehr.model.Patient;
import com.app.ehr.service.PatientService;

import org.springframework.stereotype.Controller;

import Java.util.ArrayList;
import Java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.ui.Model;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class PatientController {

   public PatientService patientService; 

   @Autowired
    public PatientController(PatientService patientService){
            this.patientService = patientService;
    }

     @RequestMapping(value="/", method= RequestMethod.GET)
    public String index(ModelMap map) {

        return "index";
    }

     @RequestMapping(value="/full-reg", method= RequestMethod.GET)
     public String fullreg(ModelMap map,Patientinfo patientInfo) {

        List<Bloodgroup> bloodList = new ArrayList<Bloodgroup>();
        List<Gendertype> genderList = new ArrayList<Gendertype>();
         List<Nationality> nationalityList = new ArrayList<Nationality>();
          List<Maritalstatus> maritalList = new ArrayList<Maritalstatus>();

        bloodList=patientService.getAllBloodgroup();
        genderList= patientService.getAllGendertype();
        nationalityList=patientService.getAllNationality();
        maritalList=patientService.getAllMaritalstatus();

        for(int i=0;i<bloodList.size();i++)
        {
            System.out.println("---------------------Controller"+bloodList.get(i));
        }
       // map.addAttribute("hello", "Hello Spring from Netbeans!!");
         map.addAttribute("patientInfo", patientInfo);
        map.addAttribute("bloodList", patientService.getAllBloodgroup());
        map.addAttribute("genderList", patientService.getAllGendertype());
         map.addAttribute("maritalList", patientService.getAllMaritalstatus());
           map.addAttribute("nationalityList", patientService.getAllNationality());
        return "demo1";
    }
        @RequestMapping(value="/add-update2", method= RequestMethod.POST)
    public String addUpdate(@ModelAttribute("patientInfo") Patientinfo patientInfo) {
System.out.println("----------------------------------------- From Controller------------------------------------------------");        
//patientService.addPatient(patientInfo);
        return "redirect:/full-reg";
    }
}

エンティティクラス-PatientInfo.Java

package com.app.ehr.entities;

import Java.io.Serializable;
import Java.math.BigInteger;
import Java.util.Date;
import javax.persistence.Basic;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

/**
 *
 * @author HP LAPTOP
 */
@Entity
@Table(name = "patientinfo")
@NamedQueries({
    @NamedQuery(name = "Patientinfo.findAll", query = "SELECT p FROM Patientinfo p")})
public class Patientinfo implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Basic(optional = false)
    @Column(name = "PatientKey")
    private Long patientKey;
    @Column(name = "PatientMRNumber")
    private String patientMRNumber;
    @Column(name = "IntPrimaryPhysicianKey")
    private BigInteger intPrimaryPhysicianKey;
    @Column(name = "FirstName")
    private String firstName;
    @Column(name = "MiddleName")
    private String middleName;
    @Column(name = "LastName")
    private String lastName;
    @Column(name = "Age")
    private Short age;
    @Column(name = "Gender")
    private String gender;
    @Column(name = "Nationality")
    private String nationality;
    @Column(name = "DateOfBirth")
    @Temporal(TemporalType.TIMESTAMP)
    private Date dateOfBirth;
    @Column(name = "MaritalStatus")
    private String maritalStatus;
    @Column(name = "Occupation")
    private String occupation;
    @Column(name = "AnnualIncome")
    private String annualIncome;
    @Column(name = "BloodGroup")
    private String bloodGroup;
    @Column(name = "Email")
    private String email;
    @Column(name = "ModeOfPayment")
    private String modeOfPayment;
    @Column(name = "ModeOfPaymentAlt")
    private String modeOfPaymentAlt;
    @Column(name = "ExtPrimaryPhysicianName")
    private String extPrimaryPhysicianName;
    @Column(name = "ExtPrimaryPhysicianPhoneNumber")
    private String extPrimaryPhysicianPhoneNumber;
    @Column(name = "IsDeleted")
    private Boolean isDeleted;
    @Column(name = "Meta_CreatedByUser")
    private String metaCreatedByUser;
    @Column(name = "Meta_UpdatedDT")
    @Temporal(TemporalType.TIMESTAMP)
    private Date metaUpdatedDT;
    @Column(name = "Meta_CreatedDT")
    @Temporal(TemporalType.TIMESTAMP)
    private Date metaCreatedDT;

    public Patientinfo() {
    }

    public Patientinfo(Long patientKey) {
        this.patientKey = patientKey;
    }

    public Long getPatientKey() {
        return patientKey;
    }

    public void setPatientKey(Long patientKey) {
        this.patientKey = patientKey;
    }

    public String getPatientMRNumber() {
        return patientMRNumber;
    }

    public void setPatientMRNumber(String patientMRNumber) {
        this.patientMRNumber = patientMRNumber;
    }

    public BigInteger getIntPrimaryPhysicianKey() {
        return intPrimaryPhysicianKey;
    }

    public void setIntPrimaryPhysicianKey(BigInteger intPrimaryPhysicianKey) {
        this.intPrimaryPhysicianKey = intPrimaryPhysicianKey;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getMiddleName() {
        return middleName;
    }

    public void setMiddleName(String middleName) {
        this.middleName = middleName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public Short getAge() {
        return age;
    }

    public void setAge(Short age) {
        this.age = age;
    }

    public String getGender() {
        return gender;
    }

    public void setGender(String gender) {
        this.gender = gender;
    }

    public String getNationality() {
        return nationality;
    }

    public void setNationality(String nationality) {
        this.nationality = nationality;
    }

    public Date getDateOfBirth() {
        return dateOfBirth;
    }

    public void setDateOfBirth(Date dateOfBirth) {
        this.dateOfBirth = dateOfBirth;
    }

    public String getMaritalStatus() {
        return maritalStatus;
    }

    public void setMaritalStatus(String maritalStatus) {
        this.maritalStatus = maritalStatus;
    }

    public String getOccupation() {
        return occupation;
    }

    public void setOccupation(String occupation) {
        this.occupation = occupation;
    }

    public String getAnnualIncome() {
        return annualIncome;
    }

    public void setAnnualIncome(String annualIncome) {
        this.annualIncome = annualIncome;
    }

    public String getBloodGroup() {
        return bloodGroup;
    }

    public void setBloodGroup(String bloodGroup) {
        this.bloodGroup = bloodGroup;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getModeOfPayment() {
        return modeOfPayment;
    }

    public void setModeOfPayment(String modeOfPayment) {
        this.modeOfPayment = modeOfPayment;
    }

    public String getModeOfPaymentAlt() {
        return modeOfPaymentAlt;
    }

    public void setModeOfPaymentAlt(String modeOfPaymentAlt) {
        this.modeOfPaymentAlt = modeOfPaymentAlt;
    }

    public String getExtPrimaryPhysicianName() {
        return extPrimaryPhysicianName;
    }

    public void setExtPrimaryPhysicianName(String extPrimaryPhysicianName) {
        this.extPrimaryPhysicianName = extPrimaryPhysicianName;
    }

    public String getExtPrimaryPhysicianPhoneNumber() {
        return extPrimaryPhysicianPhoneNumber;
    }

    public void setExtPrimaryPhysicianPhoneNumber(String extPrimaryPhysicianPhoneNumber) {
        this.extPrimaryPhysicianPhoneNumber = extPrimaryPhysicianPhoneNumber;
    }

    public Boolean getIsDeleted() {
        return isDeleted;
    }

    public void setIsDeleted(Boolean isDeleted) {
        this.isDeleted = isDeleted;
    }

    public String getMetaCreatedByUser() {
        return metaCreatedByUser;
    }

    public void setMetaCreatedByUser(String metaCreatedByUser) {
        this.metaCreatedByUser = metaCreatedByUser;
    }

    public Date getMetaUpdatedDT() {
        return metaUpdatedDT;
    }

    public void setMetaUpdatedDT(Date metaUpdatedDT) {
        this.metaUpdatedDT = metaUpdatedDT;
    }

    public Date getMetaCreatedDT() {
        return metaCreatedDT;
    }

    public void setMetaCreatedDT(Date metaCreatedDT) {
        this.metaCreatedDT = metaCreatedDT;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (patientKey != null ? patientKey.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Patientinfo)) {
            return false;
        }
        Patientinfo other = (Patientinfo) object;
        if ((this.patientKey == null && other.patientKey != null) || (this.patientKey != null && !this.patientKey.equals(other.patientKey))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "com.app.ehr.entities.Patientinfo[ patientKey=" + patientKey + " ]";
    }

}
16
north_head

問題は、次のinputフィールドを送信するときに、ブラウザクライアントが送信する日付を逆シリアル化する方法をSpringが認識していないことだと思います

<tr name="tstest">
    <td>Date Of Birth</td>
    <td><form:input path="dateOfBirth" name="timestamp" value=""/>
        <a href="javascript:show_calendar('document.tstest.timestamp', document.tstest.timestamp.value);"><img src="../images/cal.gif" width="16" height="16" border="0" alt="Click Here to Pick up the timestamp"></a>
    </td>
</tr>

Springは、そのフィールドに入力した値を取得してDateオブジェクトに変換する方法を知りません。そのためにPropertyEditorを登録する必要があります。たとえば、次を@Controllerクラスに追加します

@InitBinder
public void initBinder(WebDataBinder binder) {
    SimpleDateFormat sdf = new SimpleDateFormat("MM/dd/yyyy");
    sdf.setLenient(true);
    binder.registerCustomEditor(Date.class, new CustomDateEditor(sdf, true));
}

明らかに、SimpleDateFormatをクライアントが送信しているものに変更してください。


関連するメモでは、リダイレクトを送信して302応答を送信しています

return "redirect:/full-reg";

リクエストおよびモデル属性は、1つのリクエストの期間のみ有効であることを忘れないでください。したがって、クライアントがfull-regにリクエストを送信すると、送信したフォーム入力パラメーターはもう存在しません。これを行う方法を再考する必要があります。

26

今朝、同じエラーに遭遇しました。私のコードの問題は、フォームバインドオブジェクトで変数を整数として宣言したが、実際のフォームではテキストをキャプチャしていたことです。変数を正しい型に変更するとうまくいきました

4
Piet

これは、定義されたバインディングがユーザーの送信内容と一致しない場合に発生します。最も一般的な問題は次のとおりです。

  • PathVariable宣言がありません
  • 不完全なPathVariable宣言(たとえば、value = "variableName"がありません)
  • 上記のSotirios Delimanolisなどの間違ったデータ型の回答。入力パラメーターのクラスをシリアル化できない場合、リクエストは処理できません

したがって、一般的に、次のことを確認してください。

  • 各PathVariableが宣言されています
  • パスで一致する値に対応する値が割り当てられます-@PathVariable(value="myVariableName", String myVariable)ここで、パスは@RequestMapping(value = "/userInfo/myVariableName", method = RequestMethod.GET)を定義します
  • PathVariableに対して宣言された各クラスは、シリアル化可能でなければなりません。
4
Javierfdr

私の場合、属性としてIDとNAMEを持つオブジェクトを作成しようとしています。 IDはint、NAMEはStringですしかし、私のjsはこのような値を設定しますID = ''、NAME = 'brabrabra ...'

ID = 0に設定すると、問題は修正されます。

0

これを試して(/add-update2の代わりにadd-update2を使用)、modelAttributecommandNameに置き換えます

<form:form commandName="patientInfo" method="POST" action="/add-update2">
0
storm_buster