java – 带有JPA数据绑定的Spring MVC
发布时间:2020-12-15 04:21:08 所属栏目:Java 来源:网络整理
导读:我的问题是将 Spring从表单中获取的数据绑定到JPA实体.奇怪的是,如果我不看BindingResults,它的工作正常. BindingResults说当为字段分度传入一个空字符串时会出现绑定错误,但我知道它确实正确绑定它们,因为当我不检查Hibernate时,它会完美地更新数据库.有没
我的问题是将
Spring从表单中获取的数据绑定到JPA实体.奇怪的是,如果我不看BindingResults,它的工作正常. BindingResults说当为字段分度传入一个空字符串时会出现绑定错误,但我知道它确实正确绑定它们,因为当我不检查Hibernate时,它会完美地更新数据库.有没有办法不必编写逻辑来绕过错误触发的绑定错误?
@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) } 这是我从BindingResult类中获取的消息 09:01:36.006 [http-thread-pool-28081(5)] INFO simple - Found fieldError: graduationDay,Failed to convert property value of type java.lang.String to required type java.util.Date for property graduationDay; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type java.lang.String to type @javax.persistence.Column java.util.Date for value '; nested exception is java.lang.IllegalArgumentException 解决方法
Spring会自动绑定简单对象类型,如String和Number,但对于像java.util.Date这样的复杂对象或您自己定义的类型,您需要使用所谓的PropertyEditors或Converters,两者都可以解决您的问题.
Spring已经有一个预先定义的PropertyEditors和转换器,如@NumberFormat和@DateTimeFormat 您可以直接在您的字段上使用它们 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; } Spring还允许您定义自己的类型转换器,您必须将它与Spring ConversionService结合使用 例如,如果您有这样的Color类 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; } } 要查看有关转换器的更多信息,请查看this,同时检查this以了解转换器和PropertyEditors之间的区别 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |