2016-03-30 4 views
4

Ich bin interessiert zu wissen, ob es eine Konvention für die Benennung benutzerdefinierte Interceptor in Struts2 für die automatische Erkennung von Interzeptoren wie dort gibt sind für die Aktionsklassen.Welche Namenskonvention sollte für benutzerdefinierte Interceptor-Klasse und Paket verwendet werden, um struts.xml in Struts2 zu vermeiden

Ich verwende "struts2-convention-plugin-2.3.24.1.jar".

Die Struktur Package ist als

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 

folgen Der Code läuft perfekt ohne "struts.xml" und ohne "custInterceptor". Die Aktion wird vom struts2-convention-plugin automatisch erkannt.

Sobald ich die Abfangjäger mit

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

befestigen bekomme ich den Fehler wie unten gezeigt.

Die Dateien sind als

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 folgen

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(); 
    } 

} 

ich die folgende Fehlermeldung erhalten:

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

Lesen Sie die [docs] (https://struts.apache.org/docs/convention-plugin.html). –

+2

* Wenn Sie Fehler wie "Interceptor-Klasse nicht gefunden, referenziert von ref-name XYZ" erhalten. Dies bedeutet, dass das Paket, in dem Convention Ihre Aktionen platziert, das Paket, in dem der Interceptor definiert ist, nicht erweitert. So beheben Sie dieses Problem 1) Verwenden Sie @ParentPackage-Annotation (oder struts.convention.default.parent.package), übergeben Sie den Namen des Pakets, das den Interceptor definiert, oder 2) Erstellen Sie ein Paket in XML, das das Paket erweitert, das den Interceptor definiert , und verwenden Sie @ParentPackage (oder struts.convention.default.parent.package), um darauf zu zeigen. * –

+0

Können Sie bitte sagen, welche Code-Anweisung ich in meiner Klasse "custInterceptor.java" hinzufügen soll? Oder irgendein Link-Beispiel für den Code in der Interceptor-Klasse? –

Antwort

1

Wie in define interceptors with struts2 annotations erwähnt.

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

Um einen neuen Abfangjäger in XML definieren Sie es in struts.xml Dateien

<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> 

Sie können sehen, struts- default.xml https://struts.apache.org/docs/struts-defaultxml.html als gutes Beispiel dafür, wie Abfangjäger definiert definieren müssen und benutzt.

+0

Dies funktioniert nur bei XML-basierter Konfiguration. Aber wenn Sie eine Konfiguration verwenden, wird es mit dem Convention-Plugin funktionieren. –