gpt4 book ai didi

java - 意外异常在 'xxx' xxx' 上设置 'class xxx: Error setting expression ',值为 ['x',]

转载 作者:搜寻专家 更新时间:2023-10-31 19:55:28 25 4
gpt4 key购买 nike

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

<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>

Action 类如下。

@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 , 这些参数的值在 Action 类中可用

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

edit()方法。

如果paramsPrepareParamsStackdefaultStack 取代然后,这些消息就会消失。

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

我做错了什么?

最佳答案

这里不涉及数组问题(即使看起来是那样):这种异常意味着Struts 无法为您的参数找到一个Setter:

来自 ParametersInterceptor documentation :

Warning on missing parameters

When there is no setter for given parameter name, a warning message like below will be logged in 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)

Thus is expected behaviour to allow developer to spot missing setter or typo in either parameter name or setter.

您可以通过在 JSP 中放置一个 Action 中不存在的元素来轻松重现此错误。

由于您的属性(及其 setter )存在于模型中,并且您正在使用 ModelDrivenparamsPrepareParamsStack,我认为发生的事情是:

  • ModelDriven Interceptor 被委托(delegate)处理 Model 对象;
  • 第一次调用Parameters Interceptor时,ModelDriven Interceptor还没有运行;
  • 然后你的 Action 对 Model 对象一无所知,并尝试在 Action 中而不是在 Model 中为你的参数找到 Setters。
  • 第二个拦截器在 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>

希望对您有所帮助。

关于java - 意外异常在 'xxx' xxx' 上设置 'class xxx: Error setting expression ',值为 ['x',],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21018018/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com