Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带JPA数据绑定的Spring MVC_Java_Spring_Hibernate_Jpa - Fatal编程技术网

Java 带JPA数据绑定的Spring MVC

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

我的问题是让Spring将我从表单获得的数据绑定到JPA实体。wierd部分是,如果我不查看绑定结果,它就可以正常工作。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)
    }

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还允许您定义自己的类型转换器,您必须将其与Spring
ConversionService

例如,如果您有这样一个
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!