当前位置: 首页 > 面试题库 >

意外的异常捕获到对“类xxx”的设置“ xxx”:设置值为['x',]的表达式'xxx'时出错

郏经纬
2023-03-14
问题内容

我正在将一些参数传递给ModelDriven<Transporter>通过查询字符串实现的动作类。

<s:form namespace="/admin_side" action="Test" id="dataForm" name="dataForm">
    <s:url id="editURL" action="EditTest" escapeAmp="false">
        <s:param name="transporterId" value="1"/>
        <s:param name="transporterName" value="'DHL'"/>
    </s:url>
    <s:a href="%{editURL}">Click</s:a>
</s:form>

动作类如下。

@Namespace("/admin_side")
@ResultPath("/WEB-INF/content")
@ParentPackage(value = "struts-default")
public final class TestAction extends ActionSupport 
                           implements Serializable, Preparable, ModelDriven<Transporter>
{
    private static final long serialVersionUID = 1L;
    private Transporter transporter = new Transporter();

    @Action(value = "Test",
    results = {
        @Result(name = ActionSupport.SUCCESS, location = "Test.jsp"),
        @Result(name = ActionSupport.INPUT, location = "Test.jsp")},
    interceptorRefs = {
        @InterceptorRef(value = "paramsPrepareParamsStack", 
                 params = {"params.acceptParamNames", "transporterId, transporterName"})})
    public String load() throws Exception {
        return ActionSupport.SUCCESS;
    }

    @Action(value = "EditTest",
    results = {
        @Result(name = ActionSupport.SUCCESS, location = "Test.jsp"),
        @Result(name = ActionSupport.INPUT, location = "Test.jsp")},
    interceptorRefs = {
        @InterceptorRef(value = "paramsPrepareParamsStack", 
                 params = {"params.acceptParamNames", "transporterId, transporterName"})})
    public String edit() {
        System.out.println(transporter.getTransporterId() 
                         + " : " + transporter.getTransporterName());
        return ActionSupport.SUCCESS;
    }

    @Override
    public Transporter getModel() {
        return transporter;
    }

    @Override
    public void prepare() throws Exception {}
}

服务器终端显示以下消息。

Jan 09, 2014 4:06:32 PM com.opensymphony.xwork2.interceptor.ParametersInterceptor error
SEVERE: Developer Notification (set struts.devMode to false to disable this message):
Unexpected Exception caught setting 'transporterId' on 'class actions.TestAction: Error setting expression 'transporterId' with value ['1', ]
Jan 09, 2014 4:06:32 PM com.opensymphony.xwork2.interceptor.ParametersInterceptor error
SEVERE: Developer Notification (set struts.devMode to false to disable this message):
Unexpected Exception caught setting 'transporterName' on 'class actions.TestAction: Error setting expression 'transporterName' with value ['DHL', ]

即使日志级别为SEVERE,这些参数的值也可以在操作类中以

System.out.println(transporter.getTransporterId() 
                 + " : " + transporter.getTransporterName());

edit()方法中。

如果paramsPrepareParamsStack替换为,defaultStack则这些消息消失。

类似的表达式['DHL', ]表示一个数组。transporterIdtransporterName然而类型的模型中的是,LongString分别。

我究竟做错了什么?


问题答案:

这里不涉及数组问题(即使看起来像这样):这种异常意味着Struts找不到参数的Setter:

从ParametersInterceptor文档中:

警告缺少参数

如果没有给定参数名称的设置器,则将在devMode中记录如下警告消息:

SEVERE: Developer Notification (set struts.devMode to false to disable

this
message):
Unexpected Exception caught setting ‘search’ on ‘class
demo.ItemSearchAction:
Error setting expression ‘search’ with value [‘search’, ]
Error setting expression ‘search’ with value [‘search’, ] - [unknown
location]
at
com.opensymphony.xwork2.ognl.OgnlValueStack.handleRuntimeException(OgnlValueStack.java:201)
at
com.opensymphony.xwork2.ognl.OgnlValueStack.setValue(OgnlValueStack.java:178)
at
com.opensymphony.xwork2.ognl.OgnlValueStack.setParameter(OgnlValueStack.java:152)


因此,期望的行为是允许开发人员在参数名称或设置器中发现丢失的设置器或错字。

通过将JSP中不存在的元素放入Action中,可以轻松地重现此错误。

由于您的属性在模型中存在(及其设置器),并且您正在使用ModelDrivenparamsPrepareParamsStack,所以我认为是:

  • ModelDriven Interceptor 被委托处理Model对象;
  • 第一次致电Parameters InterceptorModelDriven Interceptor尚未运行;
  • 然后,您的操作对Model对象一无所知,并尝试在Action中而不是在Model中找到参数的Setter。
  • 相反,第二个拦截器在ModelDriven拦截器之后运行,并且确切知道在哪里设置参数。这就是为什么要在Action方法中正确设置参数的原因。

但是,如果这是真的,那么您应该 不能prepare()方法中检索那些参数(这就是您使用此堆栈的原因…):
请尝试,然后将结果发布在此处。

解决此问题的第一件事是将第一个放置ModelDriven Interceptor在第一个位置Parameters Interceptor(通过复制或移动它,我不确定这两种方式都可能产生哪种副作用(如果有)情况下,您应该再次尝试并在此处进行报告)。

然后定义以下堆栈,并使用它。

    <interceptor-stack name="modelParamsPrepareParamsStack">
        <interceptor-ref name="exception"/>
        <interceptor-ref name="alias"/>
        <interceptor-ref name="i18n"/>
        <interceptor-ref name="checkbox"/>
        <interceptor-ref name="multiselect"/>

        <!-- NEW ModelDriven Position -->
        <interceptor-ref name="modelDriven"/>

        <interceptor-ref name="params">
            <param name="excludeParams">^dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,^parameters\..*,^action:.*,^method:.*</param>
        </interceptor-ref>
        <interceptor-ref name="servletConfig"/>
        <interceptor-ref name="prepare"/>
        <interceptor-ref name="chain"/>

        <!-- OLD ModelDriven Position -->
        <!--interceptor-ref name="modelDriven"/-->

        <interceptor-ref name="fileUpload"/>
        <interceptor-ref name="staticParams"/>
        <interceptor-ref name="actionMappingParams"/>
        <interceptor-ref name="params">
            <param name="excludeParams">^dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,^parameters\..*,^action:.*,^method:.*</param>
        </interceptor-ref>
        <interceptor-ref name="conversionError"/>
        <interceptor-ref name="validation">
            <param name="excludeMethods">input,back,cancel,browse</param>
        </interceptor-ref>
        <interceptor-ref name="workflow">
            <param name="excludeMethods">input,back,cancel,browse</param>
        </interceptor-ref>
    </interceptor-stack>

希望能有所帮助。



 类似资料:
  • 我的SpringJSP中有几个参数/变量。 我需要在调用下一个jsp/控制器之前清除它们。 我将在底部清除它们。jsp是否有一个通用的解决方案?处理这个问题的最佳方法是什么? 我应该使用c:set标签吗?这是否适用于所有${xx}可能性<例如。 其中xxx是一个bean属性,或者是一个独立变量,或者是我可以通过jsp中的${xxx}访问的任何东西。

  • 如何设置第一个类为xxx的样式? 问题:比如我要设置第一个拥有red的元素的样式,css如何选中

  • 问题内容: 关于这个问题已经有其他问题了,但是没有一个是真正有用的。我是Symfony的新手,因此很难直面它。 我在文件Client \ IntranetBundle \ LDAP \ LDAPAuthenticationProvider.php中,此代码导致错误: 我确实添加了它的命名空间: LDAPUser实现UserInterface 我得到的错误是 那应该是什么意思?根据我的阅读,它与映射

  • 我正在写一个Spring MVC,并坚持以下错误: 18:34:44999警告[org.springframework.web.context.support.XmlWebApplicationContext](MSC服务线程1-1)在上下文初始化过程中遇到异常-取消刷新尝试:org。springframework。豆。工厂BeanCreationException:创建名为“org”的bean时

  • 我对spring MVC的URL模式映射是如何工作的感到困惑。 当“get servletmappings”返回“/”时,我可以用“http://localhost:8080/hello”获得正确的响应。 但如果我将其更改为“/app”并将url更改为“http://localhost:8080/app/hello”,它将返回404错误。 我是不是误会了什么,我也发现“/app/*”可以工作(这个

  • 问题内容: 在Grails中,我可以在 BootStrap的 内存dataSource中创建到H2的域对象,并使结果恢复正常,但是一旦应用启动(例如,从GSP或控制器查询),然后尝试运行查询,我得到以下信息: 我已经清理了构建 运行Grails 2.0.0 我有多个SQL Server DB的数据源,这些数据源仅对StoredProcedures进行了调用,现在发现了一个用例,它使用良好的旧Dom