2016-03-30 10 views
4

カスタムインターセプタの命名規則がstruts2に存在するかどうか知りたいと思っています。アクションクラスのためのものです。Struts2のstruts.xmlを避けるためにカスタムインターセプタクラスとパッケージに使用する命名規則

私は "struts2-convention-plugin-2.3.24.1.jar"を使用しています。 "struts.xml" なしと "custInterceptor" なし

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 

コードは完璧に実行に従うよう

パッケージ構造です。このアクションは、struts2-convention-pluginによって自動的に検出されます。できるだけ早く私は、下図のように、私はエラーを取得

@org.apache.struts2.convention.annotation.Action(value="hello", 
    [email protected]("custInterceptor")) 

で迎撃を取り付けるよう

ファイルは以下の通りです

Hello.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", 
    [email protected]("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 
+0

[docs](https://struts.apache.org/docs/convention-plugin.html)を読んでください。 –

+2

*「ref-name XYZによって参照されるインターセプタ・クラスが見つかりません」などのエラーが発生した場合。つまり、Conventionがあなたの行動をとっているパッケージは、インターセプタが定義されているパッケージを拡張しません。この問題を解決するには、1)インターセプタを定義するパッケージの名前を渡す@ParentPackageアノテーション(またはstruts.convention.default.parent.package)を使用するか、または2)インターセプタを定義するパッケージを拡張するパッケージをXMLで作成する@ParentPackage(またはstruts.convention.default.parent.package)を使用してポイントしてください。* –

+0

"custInterceptor.java"クラスにどのコードステートメントを追加する必要がありますか教えてください。 またはインターセプタクラスのコードのリンク例? –

答えて

1

define interceptors with struts2 annotationsに記載されている。

you cannot eliminate a need of struts.xml if you are using custom interceptors.

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を見ることができますし、中古。

+0

これはXMLベースの設定でのみ機能します。しかし、いくつかの設定を使用する場合、それはコンベンションプラグインで動作します。 –