栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

是什么原因导致“java.lang.IllegalStateException:bean名称“命令”的BindingResult和普通目标对象都不能用作请求属性”?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

是什么原因导致“java.lang.IllegalStateException:bean名称“命令”的BindingResult和普通目标对象都不能用作请求属性”?

您正在尝试使用Spring MVC的form标签。

此标签呈现HTML

form
标签,并向内部标签公开绑定路径以进行绑定。它将命令对象放入中,
PageContext

以便内部标签可以访问该命令对象。[..]

假设我们有一个名为的域对象

User
。它是具有诸如
firstName
和属性的JavaBean
lastName
。我们将其用作返回的表单控制器的
表单支持对象
form.jsp

换句话说,Spring MVC将提取 命令对象 并将其类型用作绑定内部标记(如或)的

path
表达式的蓝图,以呈现HTML
元素。
form
input
checkbox
form

命令对象 也称为模型属性,其名称在

form
标签
modelAttribute
commandName
属性中指定。您已在JSP中省略了它

<form:form>

您可以明确指定一个名称。这两个都是等效的。

<form:form modelAttribute="some-example-name"><form:form commandName="some-example-name">

在默认属性名称是

command
(你在错误信息看)。模型属性是对象,通常是POJO或POJO的集合,您的应用程序将其提供给Spring
MVC堆栈,并且Spring MVC堆栈将其公开给您的视图(即MVC中的M到V)。

Spring MVC将所有模型属性收集

ModelMap
在一起(它们都有名称),对于JSP,将它们转移到
HttpServletRequest
属性中,在此JSP标签和EL表达式可以访问它们。

在您的示例中,

@Controller
用于处理
GET
路径的处理程序方法
/movies
添加了一个模型属性

model.addAttribute("movies", movies); // not named 'command'

然后转发到

index.jsp
。然后,此JSP尝试渲染

<form:form>    ...    <form:input path="name" type="text" id="name" />    ...</form:form>

在呈现此代码时,

FormTag
(实际上是
InputTag
)会尝试查找名为
command
(默认属性名称)的模型属性,以便它可以生成具有由表达式和相应属性值(即)构成
<input>
name
属性的HTML
元素
path
。的结果
Movie#getFilmName()

由于找不到它,它会引发您看到的异常

java.lang.IllegalStateException: Neither BindingResult nor plain target object for bean name 'command' available as request attribute

JSP引擎将其捕获并以500状态代码响应。如果您想利用

Movie
POJO简单地正确构造表单,则可以使用以下命令显式添加模型属性

model.addAttribute("movie", new Movie());

或让Spring MVC为您创建并添加一个(必须具有可访问的无参数构造函数)

@RequestMapping(path = "/movies", method = RequestMethod.GET)public String homePage(@ModelAttribute("command") Movie movie, Model model) {...}

或者,

@ModelAttribute
在您的
@Controller
班级中添加带注释的方法

@ModelAttribute("command")public Movie defaultInstance() {    Movie movie = new Movie();    movie.setFilmName("Rocky II");    return movie;}

请注意,Spring MVC将调用此方法,并针对由封装处理的每个请求,将返回的对象隐式添加到其模型属性中

@Controller

您可能从此描述中猜测到,Spring的

form
标记更适合于
<form>
使用实际值从现有对象呈现HTML 。如果您只想创建一个blank
<form>
,那么自己构造而不依赖于任何模型属性可能更合适。

<form method="post" action="${pageContext.request.contextPath}/movies">    <input name="filmName" type="text" />    <input type="submit" value="Upload" /></form>

在接收方,您的

POST
处理程序方法仍将能够提取
filmName
输入值并将其用于初始化
Movie
对象。

常见错误

正如我们所看到的,

FormTag
查找名为一个模型属性
command
默认或名称在任一指定
modelAttribute
commandName
。确保使用正确的名称。

ModelMap
有一个
addAttribute(Object)
增加

Map
使用生成的名称为其提供的属性。

一般惯例是

返回[属性的]的小写形式的短名称

Class
,根据JavaBeans属性的命名规则:那么,
com.myapp.Product
变得
product
;
com.myapp.MyProduct
成为
myProduct
;
com.myapp.UKProduct

变成
UKProduct

如果使用的是这种(或类似的)方法,或者使用的是代表模型属性的

@RequestMapping

受支持的返回类型之一,请确保生成的名称符合您的期望。

另一个常见的错误是

@Controller
完全绕过您的方法。典型的Spring MVC应用程序遵循以下模式:

  1. 发送HTTP GET请求
  2. DispatcherServlet
    选择
    @RequestMapping
    处理请求的方法
  3. 处理程序方法生成一些模型属性并返回视图名称
  4. DispatcherServlet
    HttpServletRequest
    与视图名称相对应的JSP 添加模型属性并将其转发到JSP
  5. JSP呈现响应

如果由于某种错误配置而

@RequestMapping
完全跳过了该方法,则将不会添加属性。这可能发生

  • 如果您的HTTP请求URI直接访问您的JSP资源,例如 因为它们是可访问的,即。外面
    WEB-INF
    ,或
  • 如果
    welcome-list
    您的中
    web.xml
    包含您的JSP资源,则Servlet容器将直接呈现它,从而完全绕过Spring MVC堆栈

您希望

@Controller
以一种或另一种方式调用自己,以便适当地添加模型属性。

BindingResult
有什么关系?

A

BindingResult
是用于初始化或验证模型属性的容器。在Spring
MVC的文档状态

Errors
BindingResult
参数必须遵循被立即绑定方法签名可能有不止一个模型对象和Spring将创建一个单独的模型对象
BindingResult
为他们每个人的情况下[…]

换句话说,如果要使用

BindingResult
,则必须在
@RequestMapping
方法中遵循相应的model属性参数

@RequestMapping(path = "/movies", method = RequestMethod.POST)public String upload(@ModelAttribute("movie") Movie movie, BindingResult errors) {

BindingResult
对象也被视为模型属性。Spring
MVC使用简单的命名约定来管理它们,从而可以轻松地找到相应的常规模型属性。由于
BindingResult
包含有关模型属性的更多数据(例如,验证错误),
FormTag
因此首先尝试绑定到该属性。但是,由于它们并存,因此没有一个就不可能存在。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/382837.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号