加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

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之间的区别

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读