Model view controller 在Spring3注释中,jsr303既不获取BindingResult,也不获取bean名称的普通目标对象';数据格式';

Model view controller 在Spring3注释中,jsr303既不获取BindingResult,也不获取bean名称的普通目标对象';数据格式';,model-view-controller,spring,attributes,request,Model View Controller,Spring,Attributes,Request,使用带注释的spring 3实现一个简单的jsr303验证,当post发现缺少的元素时,我会得到以下结果: java.lang.IllegalStateException:bean名称“dataForm”的BindingResult和普通目标对象都不能作为请求属性使用 控制器看起来是这样的: @Controller @SessionAttributes @RequestMapping( "/dataentry.html" ) public class EnterDataController {

使用带注释的spring 3实现一个简单的jsr303验证,当post发现缺少的元素时,我会得到以下结果:

java.lang.IllegalStateException:bean名称“dataForm”的BindingResult和普通目标对象都不能作为请求属性使用

控制器看起来是这样的:

@Controller
@SessionAttributes
@RequestMapping( "/dataentry.html" )
public class EnterDataController
{
  @RequestMapping( method = RequestMethod.GET )
  public String enterNewDataHandler( Map model )
  {
    DataEntryForm dataForm = new DataEntryForm();
    model.put( "dataForm", dataForm );
    return ( "dataentry" );
  }

  @RequestMapping( method = RequestMethod.POST )
  public String addData( @Valid DataEntryForm dataForm,
                           BindingResult          result,
                           Map                    model )
  {
    if ( result.hasErrors() ) { return ( "dataentry" ); }

    ... code for saving data ...
  }
}
public class DataEntryForm
{
  @NotNull
  private Double dataAmount;

  @NotNull
  @Temporal(value=TemporalType.TIMESTAMP)
  private Date dataDate;

  ... sets and gets ...
}
<form:form method="post"
           commandName="dataForm"
           action="dataentry.html">
  <table>
  <tr>
    <td><form:label path=dataAmount">Data</form:label></td>
    <td><form:input path="dataAmount"/></td>
    <td><div class="error"><form:errors path="dataAmount"/></div></td>
  </tr>
  <tr>
    <td><form:label path="dataDate">Date</form:label></td>
    <td><form:input path="dataDate"/></td>
    <td><div class="error"><form:errors path="dataDate"/></div></td>
  </tr>
  <tr>
    <td colspan="2"><input type="submit" value="Add Data"/></td>
  </tr>
</table>
</form:form>
表单看起来是这样的:

@Controller
@SessionAttributes
@RequestMapping( "/dataentry.html" )
public class EnterDataController
{
  @RequestMapping( method = RequestMethod.GET )
  public String enterNewDataHandler( Map model )
  {
    DataEntryForm dataForm = new DataEntryForm();
    model.put( "dataForm", dataForm );
    return ( "dataentry" );
  }

  @RequestMapping( method = RequestMethod.POST )
  public String addData( @Valid DataEntryForm dataForm,
                           BindingResult          result,
                           Map                    model )
  {
    if ( result.hasErrors() ) { return ( "dataentry" ); }

    ... code for saving data ...
  }
}
public class DataEntryForm
{
  @NotNull
  private Double dataAmount;

  @NotNull
  @Temporal(value=TemporalType.TIMESTAMP)
  private Date dataDate;

  ... sets and gets ...
}
<form:form method="post"
           commandName="dataForm"
           action="dataentry.html">
  <table>
  <tr>
    <td><form:label path=dataAmount">Data</form:label></td>
    <td><form:input path="dataAmount"/></td>
    <td><div class="error"><form:errors path="dataAmount"/></div></td>
  </tr>
  <tr>
    <td><form:label path="dataDate">Date</form:label></td>
    <td><form:input path="dataDate"/></td>
    <td><div class="error"><form:errors path="dataDate"/></div></td>
  </tr>
  <tr>
    <td colspan="2"><input type="submit" value="Add Data"/></td>
  </tr>
</table>
</form:form>
jsp表单部分如下所示:

@Controller
@SessionAttributes
@RequestMapping( "/dataentry.html" )
public class EnterDataController
{
  @RequestMapping( method = RequestMethod.GET )
  public String enterNewDataHandler( Map model )
  {
    DataEntryForm dataForm = new DataEntryForm();
    model.put( "dataForm", dataForm );
    return ( "dataentry" );
  }

  @RequestMapping( method = RequestMethod.POST )
  public String addData( @Valid DataEntryForm dataForm,
                           BindingResult          result,
                           Map                    model )
  {
    if ( result.hasErrors() ) { return ( "dataentry" ); }

    ... code for saving data ...
  }
}
public class DataEntryForm
{
  @NotNull
  private Double dataAmount;

  @NotNull
  @Temporal(value=TemporalType.TIMESTAMP)
  private Date dataDate;

  ... sets and gets ...
}
<form:form method="post"
           commandName="dataForm"
           action="dataentry.html">
  <table>
  <tr>
    <td><form:label path=dataAmount">Data</form:label></td>
    <td><form:input path="dataAmount"/></td>
    <td><div class="error"><form:errors path="dataAmount"/></div></td>
  </tr>
  <tr>
    <td><form:label path="dataDate">Date</form:label></td>
    <td><form:input path="dataDate"/></td>
    <td><div class="error"><form:errors path="dataDate"/></div></td>
  </tr>
  <tr>
    <td colspan="2"><input type="submit" value="Add Data"/></td>
  </tr>
</table>
</form:form>


我以前有过这个问题。我认为,除了使用
@Valid
之外,还必须使用
@modeldattribute(“dataForm”)
,以便它知道如何将表单映射到DataEntryForm对象

  @RequestMapping( method = RequestMethod.POST )
  public String addData( @ModelAttribute("dataForm") @Valid DataEntryForm dataForm,
                       BindingResult          result,
                       Map                    model )
  {
      if ( result.hasErrors() ) { return ( "dataentry" ); }

      ... code for saving data ...
  }

看起来有点难看。我有点希望这两个注释能以某种方式结合起来

我在早些时候实现了这个建议,它确实起了作用,但是我尝试的几个示例应用程序没有使用@modeldattribute,运行良好,没有错误,因此这里发生的一些事情仍然没有意义。Thanks@sldahlin:同意您的意见,控制器中的modelattribute是不需要的。但若不使用model属性,则必须以某种方式向Spring展示如何解析对象。尝试在您的表单中添加modelAttribute=“dataAmount”Tag我知道它已经存在4个多月了,但这个答案解决了我的问题,谢谢!