gpt4 book ai didi

java - 带有 JPA 数据绑定(bind)的 Spring MVC

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:26:14 26 4
gpt4 key购买 nike

我的问题是让 Spring 将我从表单获得的数据绑定(bind)到 JPA 实体。奇怪的是,如果我不查看 BindingResults,它工作得很好。 BindingResults 说当为字段毕业传递空字符串时存在绑定(bind)错误,但我知道它确实正确绑定(bind)了它们,因为当我不检查 Hibernate 时,数据库会完美更新。有没有一种方法不必编写逻辑来绕过错误触发的绑定(bind)错误?

    @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 方法的方法签名

    @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 自动绑定(bind)简单的对象类型,如 String 和 Number,但对于复杂的对象,如 java.util.Date 或您自己定义的类型,您将需要使用所谓的 PropertyEditors Converters,两者都可以解决您的问题。

Spring 已经有一个预定义的PropertyEditorsConverters@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了解 ConvertersPropertyEditors

之间的区别

关于java - 带有 JPA 数据绑定(bind)的 Spring MVC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24698524/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com