我正在为令牌测试不同的场景并且遇到这个问题,当我使用时:
<action name="sincronizar" class="action.SincronizarAction">
<interceptor-ref name="token"/>
<interceptor-ref name="mystack"/>
<result name="success" type="tiles">d_sincronizar</result>
<result name="input" type="tiles">d_sincronizar</result>
<result name="invalid.token" type="tiles">d_sincronizar</result>
</action>
在控制台中出现此错误:
WARNING: Error setting expression 'struts.token' with value '[Ljava.lang.String;@3584de'
ognl.OgnlException: target is null for setProperty(null, "token",
[Ljava.lang.String;@3584de)
at ognl.OgnlRuntime.setProperty(OgnlRuntime.java:2312)
at ognl.ASTProperty.setValueBody(ASTProperty.java:127)
现在我用“basicStack”翻拍:
<action name="sincronizar" class="action.SincronizarAction">
<interceptor-ref name="token"/>
<interceptor-ref name="basicStack"/>
<result name="success" type="tiles">d_sincronizar</result>
<result name="input" type="tiles">d_sincronizar</result>
<result name="invalid.token" type="tiles">d_sincronizar</result>
</action>
并没有问题。但我需要使用我的堆栈。另外当我用相同的拦截器制作新堆栈时会遇到同样的问题。示例:lowStack same basicStack http://struts.apache.org/development/2.x/docs/interceptors.html
<interceptor-stack name="lowStack">
<interceptor-ref name="exception"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="prepare"/>
<interceptor-ref name="checkbox"/>
<interceptor-ref name="multiselect"/>
<interceptor-ref name="actionMappingParams"/>
<interceptor-ref name="params"/>
<interceptor-ref name="conversionError"/>
</interceptor-stack>
<action name="sincronizar" class="action.SincronizarAction">
<interceptor-ref name="token"/>
<interceptor-ref name="lowStack"/>
<result name="success" type="tiles">d_sincronizar</result>
<result name="input" type="tiles">d_sincronizar</result>
<result name="invalid.token" type="tiles">d_sincronizar</result>
</action>
我有同样的问题。
答案 0 :(得分:1)
这种情况正在发生,因为您缺少excludeParams
拦截器的params
参数。
看起来应该是这样的:
<interceptor-ref name="params">
<param name="excludeParams">dojo\..*,^struts\..*,^session\..*,^request\..*,^application\..*,^servlet(Request|Response)\..*,parameters\...*</param>
</interceptor-ref>
查看定义basicStack
拦截器的struts-default.xml
。
答案 1 :(得分:0)
旧问题,但我遇到了这个问题而且excludeParams无效。在测试我的应用程序时,表单上的双重提交仍然是个问题。
解决问题的方法是更深入地思考这个问题。 Struts正在尝试设置值,它并不意味着在表单上,它意味着在动作控制器java对象中。所以只需为String标记添加一个set / get。
在动作类中添加:
String token;
public void setToken(String token) { this.token = token; }
public String getToken() { return token; }
很确定这是问题所在。使用排除参数只是隐藏它,防止拦截器试图访问代码库中缺少的方法。
这里有一些很好的信息:
我发布了一些评论来扩展他的教程,等待主持人批准,然后才能看到他们。