Java 带JPA数据绑定的Spring MVC
我的问题是让Spring将我从表单获得的数据绑定到JPA实体。wierd部分是,如果我不查看绑定结果,它就可以正常工作。BindingResults说,当为字段分级传入一个空字符串时,会出现绑定错误,但我知道它确实正确地绑定了它们,因为当我不检查Hibernate时,它会完美地更新数据库。有没有一种方法不必编写逻辑来绕过错误触发的绑定错误Java 带JPA数据绑定的Spring MVC,java,spring,hibernate,jpa,Java,Spring,Hibernate,Jpa,我的问题是让Spring将我从表单获得的数据绑定到JPA实体。wierd部分是,如果我不查看绑定结果,它就可以正常工作。BindingResults说,当为字段分级传入一个空字符串时,会出现绑定错误,但我知道它确实正确地绑定了它们,因为当我不检查Hibernate时,它会完美地更新数据库。有没有一种方法不必编写逻辑来绕过错误触发的绑定错误 @Entity @Table(name="child") public class Child { @Id
@Entity
@Table(name="child")
public class Child {
@Id
@Column(name="id")
private Integer childId;
@ManyToOne(fetch=FetchType.EAGER )
@JoinColumn(name="house", referencedColumnName="house")
private House house;
@NotNull()
@Past()
@Column(name="birthday")
private Date birthday;
@Column(name="graduation_date")
private Date graduationDay;
}
我在属性编辑器中尝试了以下几行,但均无效
SimpleDateFormat dateFormat = new SimpleDateFormat("MMM dd, yyyy");
registry.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));
下面是处理请求的控制器方法的方法签名
@Controller
@SessionAttributes(value="child")
@RequestMapping(value="child")
public class ChildModController {
@RequestMapping(value="save-child.do", params="update", method = RequestMethod.POST)
public @ResponseBody Map<String,?> updateChild(
HttpServletRequest request,
@Valid @ModelAttribute(value="child")Child child,
BindingResult results)
}
Spring会自动绑定字符串和数字等简单对象类型,但对于
java.util.Date
等复杂对象或您自己定义的类型,您需要使用所谓的PropertyEditor
或转换器
,两者都可以解决您的问题
Spring已经有了预定义的属性编辑器
和转换器
和
您可以像这样直接在字段中使用它们
public class Child {
@DateTimeFormat(pattern="dd/MM/yyyy")
private Date birthday;
@DateTimeFormat(iso=ISO.DATE)
private Date graduationDay;
@NumberFormat(style = Style.CURRENCY)
private Integer myNumber1;
@NumberFormat(pattern = "###,###")
private Double myNumber2;
}
public class Color {
private String colorString;
public Color(String color){
this.colorString = color;
}
}
public class StringToColor implements Converter<String, Color> {
public Color convert(String source) {
if(source.equal("red") {
return new Color("red");
}
if(source.equal("green") {
return new Color("green");
}
if(source.equal("blue") {
return new Color("blue");
}
// etc
return null;
}
}
Spring还允许您定义自己的类型转换器,您必须将其与SpringConversionService
例如,如果您有这样一个Color
类
public class Child {
@DateTimeFormat(pattern="dd/MM/yyyy")
private Date birthday;
@DateTimeFormat(iso=ISO.DATE)
private Date graduationDay;
@NumberFormat(style = Style.CURRENCY)
private Integer myNumber1;
@NumberFormat(pattern = "###,###")
private Double myNumber2;
}
public class Color {
private String colorString;
public Color(String color){
this.colorString = color;
}
}
public class StringToColor implements Converter<String, Color> {
public Color convert(String source) {
if(source.equal("red") {
return new Color("red");
}
if(source.equal("green") {
return new Color("green");
}
if(source.equal("blue") {
return new Color("blue");
}
// etc
return null;
}
}
例如,您可以这样定义颜色转换器
public class Child {
@DateTimeFormat(pattern="dd/MM/yyyy")
private Date birthday;
@DateTimeFormat(iso=ISO.DATE)
private Date graduationDay;
@NumberFormat(style = Style.CURRENCY)
private Integer myNumber1;
@NumberFormat(pattern = "###,###")
private Double myNumber2;
}
public class Color {
private String colorString;
public Color(String color){
this.colorString = color;
}
}
public class StringToColor implements Converter<String, Color> {
public Color convert(String source) {
if(source.equal("red") {
return new Color("red");
}
if(source.equal("green") {
return new Color("green");
}
if(source.equal("blue") {
return new Color("blue");
}
// etc
return null;
}
}
公共类StringToColor实现转换器{
公共颜色转换(字符串源){
if(来源相等(“红色”){
返回新颜色(“红色”);
}
if(来源:相等(“绿色”){
返回新颜色(“绿色”);
}
if(来源:相等(“蓝色”){
返回新颜色(“蓝色”);
}
//等
返回null;
}
}
要查看有关转换器检查的更多信息,请同时检查以了解
转换器
和属性编辑器
之间的区别,尝试将导入java.util.Date
替换为导入java.sql.Date
您应该添加@DateTimeFormat(pattern=“dd/MM/yyyy”)
(或您使用的任何格式)到您的日期字段。@DateTimeFormat仍然不能很好地处理空白字符串,因此我编写了一个小转换器,当字符串等于“”时,它将返回一个空值,这是转换器的极好示例,+1!