【问题标题】:Struts 2 refactoring code to avoid OGNL static method accessStruts 2 重构代码以避免 OGNL 静态方法访问
【发布时间】:2015-03-17 02:49:59
【问题描述】:

Struts 2, 2.3.20 提到

对从表达式访问静态方法的支持将被禁用 很快,请考虑重构您的应用程序以避免进一步 问题!

我们在验证器中使用了 OGNL 静态调用:

@ExpressionValidator(
 expression = "@foo.bar@isValidAmount(amount)",
 key = "validate.amount.is.not.valid"),

我们也在标签中使用了它

<s:set var="test"
value="@foo.bar@sampleMethod(#attr.sampleObject.property1)" />

那么,重构以上两种用法的最佳方法是什么?!

【问题讨论】:

  • 通过在行动中添加包装这样的方法?
  • 这首先是错误的方法;如果这是应用程序范围的功能,您应该有自定义验证器,它们可能已经作为业务逻辑存在,只需要包装为验证器。
  • @DaveNewton,感谢您的评论。我们经常使用自定义验证器,它们可以救命 :) 但我们不能在表达式验证器中使用它们。您能否查看我的问题并发表评论:stackoverflow.com/questions/28038827/…

标签: struts2 static-methods ognl


【解决方案1】:

在您的代码中,您使用的是静态方法调用。最好的方法是在包装静态方法的操作类中创建一个方法并在 OGNL 中使用它。

public class Wrapper {
  public boolean isValidAmount(amount){
     return foo.barr.isValidAmount(amount);
  }
  public Object sampleMethod(Object property1){
     return foo.barr.sampleMethod(Object property1);
  }

}

只要 action bean 在值堆栈中,您就可以使用

@ExpressionValidator(
 expression = "isValidAmount(amount)",
 key = "validate.amount.is.not.valid"),

或在 JSP 中

<s:set var="test"
value="sampleMethod(#attr.sampleObject.property1)" />

【讨论】:

  • 我明白了。你认为给ActionSupport添加一个调用静态方法的方法是个好主意,所以我们可以使用callStaticMethod('foo.bar.validAamount','amount')callStaticMethod可以使用反射或者OGNL来调用该方法。这样已经使用OGNL静态调用的代码将保持不变。
  • 在代码中使用字符串和反射很难维护和重构。此外,使用反射的代码也会大大降低性能。至少在几年前,实际上新的 JVM 是高度优化的,但代码本身是硬编码的,缺乏可用性。
猜你喜欢
  • 1970-01-01
  • 2011-06-29
  • 2013-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-07-27
  • 2012-06-28
相关资源
最近更新 更多