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
Lesen Sie die [docs] (https://struts.apache.org/docs/convention-plugin.html). –
* 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. * –
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? –