【问题标题】:NullPointerException when using an interceptor in Struts 2在 Struts 2 中使用拦截器时出现 NullPointerException
【发布时间】:2014-04-12 00:03:07
【问题描述】:

这是我的WelcomeAction 班级:

package com.codinghazard.actions;

public class WelcomeAction {
    
    private String operandA;
    private String operandB;
    private Character operator; 
    private int sum;
    
    
    public String execute() {
        if ((operandA!="") && (operandB!=""))
        {
            int a=Integer.parseInt(operandA);
            int b=Integer.parseInt(operandB);
            switch (operator) 
            {
            case '1':
                sum=a+b;
                break;
            case '2':
                sum=a-b;
                break; 
            case '3':
                sum=a*b;
                break;
            case '4':
                try
                {
                    sum=a/b;
                }
                catch(ArithmeticException ae)
                {
                    return "ERROR";
                }
                break;                  

            }
            return "SUCCESS";
        }
        return "ERROR";
    }


    public String getOperandA() {
        return operandA;
    }


    public void setOperandA(String operandA) {
        this.operandA = operandA;
    }


    public String getOperandB() {
        return operandB;
    }


    public void setOperandB(String operandB) {
        this.operandB = operandB;
    }


    public Character getOperator() {
        return operator;
    }


    public void setOperator(Character operator) {
        this.operator = operator;
    }


    public int getSum() {
        return sum;
    }


    public void setSum(int sum) {
        this.sum = sum;
    }
}

这是我的struts.xml 文件:

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">
 
<struts>
 <!-- http://localhost:8080/test/user/login -->
    <package name="user" namespace="/user" extends="struts-default">
        <action name="calculator">
        <interceptor-ref name="timer" />
            <result>pages/Calculator.jsp</result>
        </action>
        <action name="Welcome" class="com.codinghazard.actions.WelcomeAction">
        <%--
        <interceptor-ref name="timer" />
        --%>
            <result name="SUCCESS">pages/Result.jsp</result>
            <result name="ERROR">pages/error.jsp</result>
            
        </action>
        
    </package>
 
</struts>

我尝试使用拦截器,但当我取消注释时,NullPointerException 被抛出。

我是 Struts 2 的新手,并试图理解。我的话题是拦截器,学习this教程。

【问题讨论】:

  • 您在哪一行得到异常?!请添加您的堆栈跟踪!

标签: java struts2 interceptor interceptorstack struts2-interceptors


【解决方案1】:

Struts2 框架利用interceptors 支持其功能所需的代码。为此,核心包为struts-default.xml 中的default configuration 提供了扩展和覆盖默认设置的灵活性。此配置在启动时加载并应用于您使用的每个操作,除非该操作具有自己的自定义设置。如果您想将这些设置用于包配置中的每个操作,那么您应该考虑创建拦截器堆栈。见How do we configure an Interceptor to be used with every Action

请查看 Struts 2 文档以获取上述完整详细信息 提到了拦截器。

这是来自教程链接的非常有用的建议。然而,本教程本身是为中高级读者准备的。初学者应该从Getting Started开始。

您得到了NullPointerException,因为您没有在操作配置中引用params 拦截器。而且您应该知道,如果您为具体的操作配置引用拦截器,它将使用此拦截器,而不是在操作配置未引用拦截器时默认使用的defaultStack

【讨论】:

  • 我仍然无法确定为什么它会抛出 NullPointerException。在我之前的评论中没有冒犯。
  • 我应该添加一个带有默认堆栈的拦截器吗?
  • 如果operatornull,execute 方法将抛出NPE。所以你需要初始化它。如果您提交带有operator 字段的表单,那么params 拦截器应该在操作配置中。将paramsdefaultStack 添加到其中,请参阅this 对具有相同问题的问题的回答。
  • 非常有用。谢谢
【解决方案2】:
 <action name="Welcome" class="com.codinghazard.actions.WelcomeAction">

    <interceptor-ref name="timer" />
    <interceptor-ref name="defaultStack"/>
        <result name="SUCCESS">pages/Result.jsp</result>
        <result name="ERROR">pages/error.jsp</result>

    </action>

上面试试。

当你使用任何在 struts2 的默认拦截器列表中不可用的额外拦截器时,你必须明确添加默认堆栈以利用默认 inteceptos 的功能作为参数或工作流。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-12-03
    • 2011-10-25
    • 1970-01-01
    • 2023-03-31
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多