【问题标题】:What naming convention should be used for custom Interceptor class and package in order to avoid struts.xml in Struts2为了避免 Struts2 中的 struts.xml,应为自定义 Interceptor 类和包使用什么命名约定
【发布时间】:2016-03-30 10:01:48
【问题描述】:

我很想知道 struts2 中是否有任何命名自定义拦截器的约定,用于自动检测拦截器,就像用于操作类的拦截器一样。

我正在使用“struts2-convention-plugin-2.3.24.1.jar”。

包结构如下

ProtienTracker
    >Java Resources
        >src
            >com.nagarro.actions
                >HelloAction.java
            >com.nagarro.interceptors
                >custInterceptor.java
    >WebContent
        >META_INF
        >WEB_INF
            >content
                >hello.jsp
            >lib
        >web.xml

代码在没有“struts.xml”和“custInterceptor”的情况下运行完美。该操作由 struts2-convention-plugin 自动检测。

只要我附上拦截器

@org.apache.struts2.convention.annotation.Action(value="hello",
    interceptorRefs=@InterceptorRef("custInterceptor"))

我得到如下所示的错误。

文件如下

你好.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
    <title>Hello</title>
</head>
<body>
    <h1><s:property value="greeting"/></h1>
    <p>hi</p>
</body>
</html>

HelloAction.java

package com.nagarro.actions;
import com.opensymphony.xwork2.Action;

import org.apache.struts2.convention.annotation.InterceptorRef;
import org.apache.struts2.convention.annotation.Result;
public class HelloAction implements Action {

    private String greeting="ab";

    @Override
    @org.apache.struts2.convention.annotation.Action(value="hello",
    interceptorRefs=@InterceptorRef("custInterceptor"))
    public String execute() throws Exception {
        setGreeting("Hello Structs 2");
        return "success";
    }

    public String getGreeting() {
        return greeting;
    }

    public void setGreeting(String greeting) {
        this.greeting = greeting;
    }

}

custInterceptor.java

package com.nagarro.interceptors;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

public class custInterceptor implements Interceptor{

    private static final long serialVersionUID = 1L;

    @Override
    public void destroy() {
        System.out.println("custInterceptor destroy() is called...");

    }

    @Override
    public void init() {
        System.out.println("custInterceptor init() is called...");

    }

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        System.out.println("custInterceptor intercept() is called...");
        System.out.println(invocation.getAction().getClass().getName());
        return invocation.invoke();
    }

}

我收到以下错误:

Caused by: Unable to find interceptor class referenced by ref-name custInterceptor - [unknown location]
        at com.opensymphony.xwork2.config.providers.InterceptorBuilder.constructInterceptorReference(InterceptorBuilder.java:63)
        at org.apache.struts2.convention.DefaultInterceptorMapBuilder.buildInterceptorList(DefaultInterceptorMapBuilder.java:95)
        at org.apache.struts2.convention.DefaultInterceptorMapBuilder.build(DefaultInterceptorMapBuilder.java:86)
        at org.apache.struts2.convention.DefaultInterceptorMapBuilder.build(DefaultInterceptorMapBuilder.java:70)
        at org.apache.struts2.convention.PackageBasedActionConfigBuilder.createActionConfig(PackageBasedActionConfigBuilder.java:947)
        at org.apache.struts2.convention.PackageBasedActionConfigBuilder.buildConfiguration(PackageBasedActionConfigBuilder.java:734)
        at org.apache.struts2.convention.PackageBasedActionConfigBuilder.buildActionConfigs(PackageBasedActionConfigBuilder.java:355)
        at org.apache.struts2.convention.ClasspathPackageProvider.loadPackages(ClasspathPackageProvider.java:53)
        at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:274)
        at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:67)
        ... 17 more

【问题讨论】:

  • 阅读docs
  • 如果您收到“无法找到引用名称 XYZ 引用的拦截器类”之类的错误。这意味着 Convention 放置您的操作的包不会扩展定义拦截器的包。要解决此问题,1)使用 @ParentPackage 注释(或 struts.convention.default.parent.package)传递定义拦截器的包的名称,或 2)在 XML 中创建一个包,扩展定义拦截器的包,并使用@ParentPackage(或struts.convention.default.parent.package)指向它。
  • 你能告诉我应该在我的“custInterceptor.java”类中添加什么代码语句吗?或者 Interceptor 类中代码的任何链接示例?
  • 你可以实现自己的ConfigurationProvider来发现拦截器并将它们添加到全局配置struts.apache.org/docs/…

标签: java jsp struts2


【解决方案1】:

define interceptors with struts2 annotations中所述。

如果您使用自定义,则无法消除对 struts.xml 的需求 拦截器。

要在 xml 中定义一个新的拦截器,你需要在 struts.xml 文件中定义它

<struts>
    ......
 <package name="my-default" extends="struts-default" />

   <!-- Define the intercepor class and give it a name-->
    <interceptors>
       <interceptor name="custInterceptor"  class=com.nagarro.interceptors.custInterceptor" />
    </interceptors>

   <!-- Add it to a package. for example I add 
              the interceptor at top of struts default stack-->
   <interceptor-stack name="myDefaultStack">
      <interceptor-ref name="custInterceptor"/>
      <interceptor-ref name="defaultStack"/>
   </interceptor-stack>    

  <!-- Use the interceptor stack in your action with @InterceptorRef or set it as default -->
  <default-interceptor-ref name="myDefaultStack" />

 </package>
</struts>

您可以将 struts-default.xml https://struts.apache.org/docs/struts-defaultxml.html 视为如何定义和使用拦截器的一个很好的示例。

【讨论】:

  • 这仅适用于基于 xml 的配置。但是如果你使用一些配置,它将与约定插件一起使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-25
  • 2011-04-26
  • 1970-01-01
  • 2017-09-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多