我遇到的问题如下 - 有一个jsp页面Register.jsp,其形式如下 -
<form:form modelAttribute="user" action="Register" class="form-horizontal col-lg-8 col-lg-offset-2 col-md-10 col-md-offset-1 col-sm-12 col-xs-12" method="POST" role="form" autocomplete="off">
<fieldset>
<legend>Basic Info</legend>
<div class="form-group">
<form:label path="firstName" class="control-label col-lg-4 col-md-4 col-sm-4 col-xs-4">First Name <b>*</b></form:label>
<div class="col-lg-8 col-md-8 col-sm-8 col-xs-8">
<form:input path="firstName" type="text" name="firstName" id="firstName" class="capitalize form-control required" required="true" />
<form:errors path="firstName" cssClass="error" element="label"></form:errors>
</div>
</div>
<div class="form-group">
<form:label path="secondName" class="control-label col-lg-4 col-md-4 col-sm-4 col-xs-4">Middle Name</form:label>
<div class="col-lg-8 col-md-8 col-sm-8 col-xs-8">
<form:input path="secondName" type="text" name="secondName" id="secondName" class="capitalize form-control" />
<form:errors path="secondName" cssClass="error" element="label"></form:errors>
</div>
</div>
<div class="form-group">
<form:label path="lastName" class="control-label col-lg-4 col-md-4 col-sm-4 col-xs-4">Last Name <b>*</b></form:label>
<div class="col-lg-8 col-md-8 col-sm-8 col-xs-8">
<form:input type="text" name="lastName" path="lastName" id="lastName" class="capitalize form-control" required="true" />
<form:errors path="lastName" cssClass="error" element="label"></form:errors>
</div>
</div>
<div class="form-group">
<form:label path="email" class="control-label col-lg-4 col-md-4 col-sm-4 col-xs-4">Email <b>*</b></form:label>
<div class="col-lg-8 col-md-8 col-sm-8 col-xs-8">
<form:input type="email" path="email" name="email" class="form-control" required="true" />
<form:errors path="email" cssClass="error" element="label"></form:errors>
</div>
</div>
<div class="form-group">
<form:label path="dob" class="control-label col-lg-4 col-md-4 col-sm-4 col-xs-4">DOB <b>*</b></form:label>
<div class="col-lg-8 col-md-8 col-sm-8 col-xs-8">
<form:input path="dob" type="date" name="dob" class="dob form-control" required="true" />
<form:errors path="dob" cssClass="error" element="label"></form:errors>
</div>
</div>
<c:set var="converter" value="${converter}"></c:set>
<div class="form-group">
<form:label path="city.state.country.id" class="control-label col-lg-4 col-md-4 col-sm-4 col-xs-4">Country <b>*</b></form:label>
<div class="col-lg-8 col-md-8 col-sm-8 col-xs-8">
<form:select path="city.state.country.id" name="country" class="form-control" required="true">
<c:forEach items="${countries}" var="country">
<option value="${converter.encryptAnID(country.id)}"><c:out value="${country.name}"></c:out></option>
</c:forEach>
</form:select>
<form:errors path="city.state.country.id" cssClass="error" element="label"></form:errors>
</div>
</div>
<div class="form-group">
<form:label path="city.state" class="control-label col-lg-4 col-md-4 col-sm-4 col-xs-4">State <b>*</b></form:label>
<div class="col-lg-8 col-md-8 col-sm-8 col-xs-8">
<form:select path="city.state.id" name="city" class="form-control" required="true">
<c:forEach items="${states}" var="state">
<form:option value="${converter.encryptAnID(state.id)}"><c:out value="${state.name}"></c:out></form:option>
</c:forEach>
</form:select>
<form:errors path="city.state.id" cssClass="error" element="label"></form:errors>
</div>
</div>
<div class="form-group">
<form:label path="city.name" class="control-label col-lg-4 col-md-4 col-sm-4 col-xs-4">City <b>*</b></form:label>
<div class="col-lg-8 col-md-8 col-sm-8 col-xs-8">
<form:input path="city.name" type="text" name="city" id="city" class="capitalize form-control" required="true"/>
<form:errors path="city.name" cssClass="error" element="label"></form:errors>
</div>
</div>
<div class="form-group">
<form:label path="zip" class="control-label col-lg-4 col-md-4 col-sm-4 col-xs-4">Pincode/ZIP <b>*</b></form:label>
<div class="col-lg-8 col-md-8 col-sm-8 col-xs-8">
<form:input path="zip" type="text" name="zip" id="zip" class="form-control" required="true"/>
<form:errors path="zip" cssClass="error" element="label"></form:errors>
</div>
</div>
<div class="form-group">
<label class="control-label col-lg-4 col-md-4 col-sm-4 col-xs-4">Solve equation </label>
<div class="col-lg-8 col-md-8 col-sm-8 col-xs-8">
<img src="<c:url value='/Captcha'></c:url>">
</div>
</div>
<div class="form-group">
<label class="control-label col-lg-4 col-md-4 col-sm-4 col-xs-4" for="captcha">Solution <b>*</b></label>
<div class="col-lg-8 col-md-8 col-sm-8 col-xs-8">
<input name="captcha" id="captcha" class="form-control" type="text" value="" required="true"/>
</div>
</div>
<div class="form-group">
<div class="col-lg-8 col-md-8 col-sm-8 col-xs-8 col-lg-offset-4 col-md-offset-4 col-sm-offset-4 col-xs-offset-4">
<button type="submit" class="btn btn-primary">Register</button>
<button type="reset" class="btn btn-default">Reset</button>
</div>
</div>
</fieldset>
</form:form>
你可以看到我在jsp加密国家和国家的ID 现在处理此请求的控制器方法就是这样 -
@RequestMapping(value="/Register",method= RequestMethod.POST)
public String register(@ModelAttribute("user") @Valid User user, BindingResult bindingResult){
if(bindingResult.hasErrors()){
System.out.println("Errors detected");
List<ObjectError> errors = bindingResult.getAllErrors();
for(ObjectError error:errors){
System.out.println(error.toString());
}
return "Register";
}else{
return "redirect:/Home";
}
}
用户bean有一个名为country的属性,它引用对象Country类 这是我的国家班级 -
@Entity
@Table(name="country"
,catalog="tutor"
)
public class Country implements java.io.Serializable {
private Integer id;
private String name;
private String code;
private List<State> states = new ArrayList<State>(0);
public Country() {
}
public Country(String name, String code) {
this.name = name;
this.code = code;
}
public Country(String name, String code, List<State> states) {
this.name = name;
this.code = code;
this.states = states;
}
@Id @GeneratedValue(strategy=IDENTITY)
@Column(name="id", unique=true, nullable=false)
public Integer getId() {
return this.id;
}
public void setId(Integer id) {
this.id = id;
}
@Column(name="name", nullable=false, length=45)
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
@Column(name="code", nullable=false, length=2)
public String getCode() {
return this.code;
}
public void setCode(String code) {
this.code = code;
}
@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.LAZY, mappedBy="country")
public List<State> getStates() {
return this.states;
}
public void setStates(List<State> states) {
this.states = states;
}
}
提交表单后,我收到此错误 -
无法将类型为java.lang.String的属性值转换为属性city.state.country.id所需的java.lang.Integer类型;嵌套异常是java.lang.NumberFormatException:对于输入字符串:“204169936916065690991063869295677385346323054608”
问题是该国家的obvoius id是整数但加密后,option的值是字符串,无法将其转换为整数。那么有没有办法指示控制器或bean用定义的方法解密这个值,并在验证之前接受字符串参数和返回整数。
答案 0 :(得分:-1)
使用Spring中的Formatter和/或转换器而不是自己滚动。这将被称为渲染和解析结果。