Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Struts 2在Struts.ognl.allowStaticMethodAccess为false时调用静态方法_Java_Reflection_Struts2_Ognl_Valuestack - Fatal编程技术网

Java Struts 2在Struts.ognl.allowStaticMethodAccess为false时调用静态方法

Java Struts 2在Struts.ognl.allowStaticMethodAccess为false时调用静态方法,java,reflection,struts2,ognl,valuestack,Java,Reflection,Struts2,Ognl,Valuestack,struts 2将struts.ognl.allowStaticMethodAccess设置为false,以解决安全问题。静态方法调用在某些情况下可能很有用,例如在处理表达式基验证器时 解决此问题的一种方法是在操作中定义一个helper方法,例如,如果我们想使用Math类,我们应该添加以下内容: public double randomMath(){ return Math.random(); } public double asinMath(double a){ return Ma

struts 2将
struts.ognl.allowStaticMethodAccess
设置为
false
,以解决安全问题。静态方法调用在某些情况下可能很有用,例如在处理表达式基验证器时

解决此问题的一种方法是在操作中定义一个helper方法,例如,如果我们想使用
Math
类,我们应该添加以下内容:

public double randomMath(){
  return Math.random();
}


public double asinMath(double a){
  return Math.asin(a);
}

....
并将其用作
${randomMath}
${asinMath(1)}

正如您可以看到的,对于
Math
类中的每个方法,我们需要在我们的操作中定义一个具有相同签名的
public
方法


有没有更好的方法来避免这些陈词滥调

OGNL允许执行方法,但默认情况下禁用静态访问,因此不能在表达式中使用静态方法。但是,您可以教OGNL哪些类需要访问静态方法

方法调用是OGNL需要根据动态信息查找方法的另一个领域。
MethodAccessor
接口提供了一个钩子,用于钩住OGNL调用方法的方式。当请求静态或实例方法时,将调用此接口的实现程序来实际执行该方法

public interface MethodAccessor
{

    Object callStaticMethod( Map context, Class targetClass, String methodName, List args )
        throws MethodFailedException;

    Object callMethod( Map context, Object target, String methodName, List args )
        throws MethodFailedException;

}
您可以使用
OgnlRuntime.setMethodAccessor()
逐个类设置方法访问器。是对象的默认方法访问器(它只是根据方法名称和参数类型查找适当的方法,并使用反射调用该方法)


你可以编写代码

public class StringUtil extends StringUtils implements MethodAccessor {
  //implement above methods
}  

动作类
在JSP中



XY问题。创建自定义验证器。亲爱的@AleksandrM谢谢,但通过这种方式,我将创建许多非原子自定义验证器。正如您猜测的那样,对于自定义验证器,我需要删除
@FieldExpressionValidator
@ExpressionValidator
,并为每个表达式创建一个自定义验证器。非原子是什么意思?可测试性。如果验证器中有复杂的条件,那么如何测试它?将它放在自定义验证器中,可以对其进行单元测试。您不必仅为复杂表达式为每个表达式创建自定义验证器。您可以创建一些更通用的验证器并用参数控制它。为什么这比struts.ognl.allowStaticMethodAccess更好?xml验证呢?您的帖子中没有它的迹象。@AleksandrM
struts.ognl.allowStaticMethodAccess
没有被这段代码使用。但是为什么这个方法比struts.ognl.allowStaticMethodAccess更好呢?你认为
struts.ognl.allowStaticMethodAccess
该怎么办?@AleksandrM如果你不理解OP的问题,最好不要
struts.ognl.allowStaticMethodAccess
,而是不手动编写,将所有方法委托给不能使用
struts.ognl.allowStaticMethodAccess
的静态方法是错误的。
public static final String MESSAGE = "hello.message";

/**
 * Field for Message property.
 */
private String message;

/**
 * Return Message property.
 *
 * @return Message property
 */
public String getMessage() {
    return message;
}
private StringUtil stringUtil = new StringUtil();

public StringUtil getStringUtil() {
  return stringUtil;
}

public String execute() throws Exception {
    setMessage(getText(MESSAGE));
    OgnlRuntime.setMethodAccessor(StringUtil.class, stringUtil);
    return SUCCESS;
}