This week's book giveaway is in the Servlets forum.
We're giving away four copies of Murach's Java Servlets and JSP and have Joel Murach on-line!
See this thread for details.
The moose likes Spring and the fly likes Binding a single spring form to multiple POJO Class Big Moose Saloon
  Search | Java FAQ | Recent Topics | Flagged Topics | Hot Topics | Zero Replies
Register / Login


Win a copy of Murach's Java Servlets and JSP this week in the Servlets forum!
JavaRanch » Java Forums » Frameworks » Spring
Bookmark "Binding a single spring form to multiple POJO Class" Watch "Binding a single spring form to multiple POJO Class" New topic
Author

Binding a single spring form to multiple POJO Class

Suresh Lal
Greenhorn

Joined: Nov 24, 2011
Posts: 2
Hello,

I tried to bind the spring form to multiple POJO class, but i could not successfully do that and i am getting the following error.
I am in need of any one who can help me to solve this issue.
Here by i am adding the Spring Form, POJO Classes and the Controller class.



org.apache.jasper.JasperException: An exception occurred processing JSP page /view/createaccount.jsp at line 59

56: </tr>
57:
58: <tr>
59: <td>Card No:<FONT color="red"><form:errors
60: path="cardNo" /></FONT></td>
61:
62:


Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:510)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:419)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:238)
org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:250)
org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1047)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:817)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549)
javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)

root cause

org.springframework.beans.NotReadablePropertyException: Invalid property 'cardNo' of bean class [com.mbank.entity.AccountDetails]: Bean property 'cardNo' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?
org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:707)
org.springframework.beans.BeanWrapperImpl.getPropertyValue(BeanWrapperImpl.java:699)
org.springframework.validation.AbstractPropertyBindingResult.getActualFieldValue(AbstractPropertyBindingResult.java:98)
org.springframework.validation.AbstractBindingResult.getFieldValue(AbstractBindingResult.java:224)
org.springframework.web.servlet.support.BindStatus.<init>(BindStatus.java:120)
org.springframework.web.servlet.tags.form.AbstractDataBoundFormElementTag.getBindStatus(AbstractDataBoundFormElementTag.java:174)
org.springframework.web.servlet.tags.form.ErrorsTag.shouldRender(ErrorsTag.java:140)
org.springframework.web.servlet.tags.form.AbstractHtmlElementBodyTag.writeTagContent(AbstractHtmlElementBodyTag.java:47)
org.springframework.web.servlet.tags.form.AbstractFormTag.doStartTagInternal(AbstractFormTag.java:102)
org.springframework.web.servlet.tags.RequestContextAwareTag.doStartTag(RequestContextAwareTag.java:79)
org.apache.jsp.view.createaccount_jsp._jspService(createaccount_jsp.java:280)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:377)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:313)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:260)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.springframework.web.servlet.view.InternalResourceView.renderMergedOutputModel(InternalResourceView.java:238)
org.springframework.web.servlet.view.AbstractView.render(AbstractView.java:250)
org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1047)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:817)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:719)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:644)
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:549)
javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)



Spring Form
=========

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Mobile Banking - Creating an online account</title>
</head>
<body>
<center>
<h2>Account Creation Form</h2>
<form:form action="createaccount.html" commandName="accountDetails">
<table>
<tr>
<td>First Name:<FONT color="red"><form:errors
path="firstName" /></FONT></td>


<td><form:input path="firstName" /></td>
</tr>
<tr>
<td>Last Name:<FONT color="red"><form:errors
path="lastName" /></FONT></td>

<td><form:input path="lastName" /></td>

</tr>
<tr>
<td>Account Type:<FONT color="red"><form:errors
path="accountType" /></FONT></td>

<td><form:input path="accountType" /></td>
</tr>


<tr>
<td>Mobile No:<FONT color="red"><form:errors
path="mobileNo" /></FONT></td>

<td><form:input path="mobileNo" /></td>
</tr>

<tr>
<td>Phone No:<FONT color="red"><form:errors
path="phoneNo" /></FONT></td>

<td><form:input path="phoneNo" /></td>
</tr>

<tr>
<td>Email:<FONT color="red"><form:errors
path="email" /></FONT></td>

<td><form:input path="email" /></td>
</tr>

<tr>
<td>Card No:<FONT color="red"><form:errors
path="cardNo" /></FONT></td>


<td><form:input path="cardNo" /></td>
</tr>
<tr>
<td>Pin:<FONT color="red"><form:errors
path="pin" /></FONT></td>

<td><form:input path="pin" /></td>
</tr>

<tr>
<td>Address Line 1:<FONT color="red"><form:errors
path="adressLine1" /></FONT></td>


<td><form:input path="adressLine1" /></td>
</tr>
<tr>
<td>Address Line 1:<FONT color="red"><form:errors
path="adressLine2" /></FONT></td>

<td><form:input path="adressLine2" /></td>
</tr>

<tr>
<td>City:<FONT color="red"><form:errors
path="city" /></FONT></td>

<td><form:input path="city" /></td>
</tr>

<tr>
<td>State:<FONT color="red"><form:errors
path="state" /></FONT></td>

<td><form:input path="state" /></td>
</tr>

<tr>
<td>Country:<FONT color="red"><form:errors
path="country" /></FONT></td>

<td><form:input path="country" /></td>
</tr>

<tr>
<td><input type="submit" value="Submit" /></td>
</tr>
</table>
</form:form>
</center>
</body>
</html>


POJO Classes
=============

public class AccountDetails {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int accountId;
private String firstName;
private String lastName;
private String currentBalance;
private String accountType;
private String mobileNo;
private String phoneNo;
private String email;


@OneToOne
@JoinColumn(name="addressId")
private Address address;

@OneToOne(mappedBy="accountDetails")
private MasterLogin masterLogin;



public MasterLogin getMasterLogin() {
return masterLogin;
}
public void setMasterLogin(MasterLogin masterLogin) {
this.masterLogin = masterLogin;
}
public Address getAddress() {
return address;
}
public void setAddress(Address address) {
this.address = address;
}
public String getMobileNo() {
return mobileNo;
}
public void setMobileNo(String mobileNo) {
this.mobileNo = mobileNo;
}
public String getPhoneNo() {
return phoneNo;
}
public void setPhoneNo(String phoneNo) {
this.phoneNo = phoneNo;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public int getAccountId() {
return accountId;
}
public void setAccountId(int accountId) {
this.accountId = accountId;
}
public String getFirstName() {
return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public String getLastName() {
return lastName;
}
public void setLastName(String lastName) {
this.lastName = lastName;
}
public String getCurrentBalance() {
return currentBalance;
}
public void setCurrentBalance(String currentBalance) {
this.currentBalance = currentBalance;
}
public String getAccountType() {
return accountType;
}
public void setAccountType(String accountType) {
this.accountType = accountType;
}

}







public class Address {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int addressId;
private String adressLine1;
private String adressLine2;
private String city;
private String state;
private String country;
public int getAddressId() {
return addressId;
}
public void setAddressId(int addressId) {
this.addressId = addressId;
}
public String getAdressLine1() {
return adressLine1;
}
public void setAdressLine1(String adressLine1) {
this.adressLine1 = adressLine1;
}
public String getAdressLine2() {
return adressLine2;
}
public void setAdressLine2(String adressLine2) {
this.adressLine2 = adressLine2;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getState() {
return state;
}
public void setState(String state) {
this.state = state;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}

}



public class MasterLogin {
@Id
@NotEmpty(message="Card No Cannot be empty")
@NumberFormat(style = Style.NUMBER)
private Integer cardNo;

private String loginName;

@NotEmpty(message="Pin Cannot be empty")
@Size(min = 4, max = 4, message = "Pin must be of 4 Characters.")
private String pin;

@OneToOne
@JoinColumn(name="accountId")
private AccountDetails accountDetails;

@OneToMany(mappedBy="masterLogin")
private Collection<TransactionHistory> transactionHistory=new ArrayList<TransactionHistory>();


public AccountDetails getAccountDetails() {
return accountDetails;
}
public void setAccountDetails(AccountDetails accountDetails) {
this.accountDetails = accountDetails;
}
public Collection<TransactionHistory> getTransactionHistory() {
return transactionHistory;
}
public void setTransactionHistory(
Collection<TransactionHistory> transactionHistory) {
this.transactionHistory = transactionHistory;
}
public Integer getCardNo() {
return cardNo;
}
public void setCardNo(Integer cardNo) {
this.cardNo = cardNo;
}
public String getLoginName() {
return loginName;
}
public void setLoginName(String loginName) {
this.loginName = loginName;
}
public String getPin() {
return pin;
}
public void setPin(String pin) {
this.pin = pin;
}


}


Controller Class
=================

public class MasterLogin {
@Id
@NotEmpty(message="Card No Cannot be empty")
@NumberFormat(style = Style.NUMBER)
private Integer cardNo;

private String loginName;

@NotEmpty(message="Pin Cannot be empty")
@Size(min = 4, max = 4, message = "Pin must be of 4 Characters.")
private String pin;

@OneToOne
@JoinColumn(name="accountId")
private AccountDetails accountDetails;

@OneToMany(mappedBy="masterLogin")
private Collection<TransactionHistory> transactionHistory=new ArrayList<TransactionHistory>();


public AccountDetails getAccountDetails() {
return accountDetails;
}
public void setAccountDetails(AccountDetails accountDetails) {
this.accountDetails = accountDetails;
}
public Collection<TransactionHistory> getTransactionHistory() {
return transactionHistory;
}
public void setTransactionHistory(
Collection<TransactionHistory> transactionHistory) {
this.transactionHistory = transactionHistory;
}
public Integer getCardNo() {
return cardNo;
}
public void setCardNo(Integer cardNo) {
this.cardNo = cardNo;
}
public String getLoginName() {
return loginName;
}
public void setLoginName(String loginName) {
this.loginName = loginName;
}
public String getPin() {
return pin;
}
public void setPin(String pin) {
this.pin = pin;
}


}


Thanks & Regards
Suresh

Karthik Jayachandran
Ranch Hand

Joined: Feb 18, 2009
Posts: 88

The log itself says the error,



Check whether the com.mbank.entity.AccountDetails has cardNo property. If it exists, check the getters and setters.


Note: Please post the code in code tags
 
It is sorta covered in the JavaRanch Style Guide.
 
subject: Binding a single spring form to multiple POJO Class
 
Similar Threads
Can't find bean in any scope
Neither BindingResult nor plain target object for bean name 'loginForm
Problem with validation example
pagination exception in spring
Can't read from 'messages.properties' file