La solicitud enviada por el cliente fue sintácticamente incorrecta.-Plantilla Spring MVC + JDBC

Soy novato de Spring MVC. Me quedé atrapado por un error al ejecutar mi proyecto. Error: la solicitud enviada por el cliente era sintácticamente incorrecta. Tengo una clase de entidad PatientInfo. Mi página jsp es demo1. Mi controlador es controlador de paciente. La funcionalidad que deseo implementar es Insertar valores en la base de datos. Pero no puedo llamar a mi función (add-update2) en el controlador.

demo1.jsp

   Registration Form   

Full Registration Form


First Name
Middle Name
Last Name
Age
Gender
Marital Status
Nationality
Date Of Birth
Click Here to Pick up the timestamp
E-mail
Blood Group

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 bloodList = new ArrayList(); List genderList = new ArrayList(); List nationalityList = new ArrayList(); List maritalList = new ArrayList(); 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"; } } 

Entity Class- 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 + " ]"; } } 

Creo que el problema es que Spring no sabe cómo deserializar la fecha que envía su navegador al enviar el siguiente campo de input en

  Date Of Birth  Click Here to Pick up the timestamp   

Spring no sabe cómo tomar el valor que ingresa en ese campo y convertirlo en un objeto Date . Necesita registrar un PropertyEditor para eso. Por ejemplo, agregue lo siguiente a su clase @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)); } 

Obviamente, cambie SimpleDateFormat a lo que su cliente esté enviando.


En una nota relacionada, estás enviando una respuesta 302 enviando un redireccionamiento

 return "redirect:/full-reg"; 

Recuerde que los atributos de modelo y solicitud solo se publican durante la duración de una solicitud. Entonces, cuando su cliente envía la solicitud al full-reg , ninguno de los parámetros de entrada del formulario que envió originalmente ya existen. Deberías volver a pensar cómo haces esto.

Me encontré con el mismo error esta mañana. El problema con mi código era que había declarado una variable como un entero en mi objeto de enlace de formulario pero en la forma real que estaba capturando el texto. Cambiar la variable al tipo correcto funcionó para mí

Esto ocurre cuando el enlace definido no coincide con lo que el usuario está enviando. Los problemas más comunes son:

  • Falta la statement PathVariable
  • Declaración Incomplete PathVariable (por ejemplo, valor faltante = “variableName”)
  • Tipo de datos incorrecto, como Sotirios Delimanolis, respuesta anterior. Si la clase de un parámetro de entrada no se puede serializar, la solicitud no es procesable

Entonces, en general, asegúrese de que:

  • Cada PathVariable está declarado
  • Se asigna un valor que corresponde al valor que debe coincidir en la ruta – @PathVariable(value="myVariableName", String myVariable) donde la ruta define @RequestMapping(value = "/userInfo/myVariableName", method = RequestMethod.GET)
  • Cada clase declarada para un PathVariable debe ser serializable.

intente con esto (con /add-update2 lugar de simplemente add-update2 ) y reemplace modelAttribute por modelAttribute

  

En mi caso, trato de crear un objeto que tenga ID y NAME como atributos. ID es int, NAME es String. Pero mi js estableció valores como este ID = ”, NAME = ‘brabrabra …’

Después de establecer ID = 0, el problema se soluciona.