web-dev-qa-db-fra.com

La requête envoyée par le client était syntaxiquement incorrecte.-Spring MVC + JDBC Template

Je suis un débutant dans Spring MVC . Une erreur s'est produite lors de l'exécution de mon projet Erreur - La demande envoyée par le client était syntaxiquement incorrecte. J'ai une classe d'entité PatientInfo . Ma page jsp est demo1 . Mon contrôleur est Patient Controller . La fonctionnalité que je souhaite implémenter est Insérer des valeurs dans la base de données . Mais je Je ne peux pas appeler ma fonction (add-update2) dans le contrôleur.

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";
    }
}

Classe d'entité - 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

Je pense que le problème est que Spring ne sait pas comment désérialiser la date que votre client de navigateur envoie lors de l'envoi du champ input suivant

<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 ne sait pas comment prendre la valeur que vous entrez dans ce champ et la convertir en un objet Date. Vous devez enregistrer une PropertyEditor pour cela. Par exemple, ajoutez ce qui suit à votre classe @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));
}

Évidemment, remplacez la variable SimpleDateFormat par tout ce que votre client envoie.


Sur une note connexe, vous envoyez une réponse 302 en envoyant une redirection

return "redirect:/full-reg";

N'oubliez pas que les attributs de requête et de modèle ne vivent que pendant la durée d'une requête. Ainsi, lorsque votre client envoie la demande à full-reg, aucun des paramètres de saisie de formulaire que vous avez envoyés n’existe plus. Vous devriez repenser à la façon dont vous faites cela.

26

Je suis tombé sur la même erreur ce matin. Le problème avec mon code était que j'avais déclaré une variable sous forme d'entier dans mon objet de liaison de formulaire, mais que je capturais du texte sur le formulaire même. Changer la variable au type correct élaboré pour moi

4
Piet

Cela se produit lorsque la liaison définie ne correspond pas à ce que l'utilisateur envoie. Les problèmes les plus courants sont les suivants:

  • Déclaration PathVariable manquante
  • Déclaration PathVariable incomplète (par exemple valeur manquante = "nomVariable")
  • Type de données incorrect, tel que la réponse de Sotirios Delimanolis ci-dessus. Si la classe d'un paramètre d'entrée ne peut pas être sérialisée, la demande n'est pas traitable.

Donc, en général, assurez-vous que:

  • Chaque variable de chemin est déclarée
  • Une valeur est assignée qui correspond à la valeur à rechercher dans le chemin - @PathVariable(value="myVariableName", String myVariable) où le chemin définit @RequestMapping(value = "/userInfo/myVariableName", method = RequestMethod.GET)
  • Chaque classe déclarée pour un PathVariable doit être sérialisable.
4
Javierfdr

Dans mon cas, j'essaie de créer un objet ayant pour attribut ID et NAME en tant qu'attributs . ID est int, NAME est String. Mais mon js a défini des valeurs comme celle-ci ID = '', NAME = 'brabrabra ...'

Après avoir défini l'ID = 0, le problème est résolu.

0
Aekkawit Chanpen

essayez avec ceci (avec /add-update2 au lieu de add-update2) et remplacez modelAttribute par commandName

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