Struts 2 с ошибкой аннотации: невозможно найти родительский пакет
Я пытаюсь использовать плитки вместе со Struts2. Я использую аннотации к классам действий struts2, как показано ниже. Я определил родительский пакет по умолчанию с помощью плагина соглашения struts2, а также определил пакет "rcg.console", который расширяется из пакетов struts-default и tile-default. Однако, когда я запускаю свой сервер Tomcat, я получаю следующее исключение. Но если я изменю @ParentPackage(value="rcg.console")
аннотация на моем классе действий к @ParentPackage(value="tiles-default")
ошибка уходит. Если я не определю @ParentPackage
аннотация, Struts не может обнаружить мой тип результата "плитки". Может кто-нибудь, пожалуйста, помогите мне с этим?
SEVERE: Exception starting filter struts2
Unable to load configuration. - [unknown location]
at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:501)
at org.apache.struts2.dispatcher.ng.InitOperations.initDispatcher(InitOperations.java:74)
at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.init(StrutsPrepareAndExecuteFilter.java:57)
at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:281)
at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:262)
at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:107)
at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4656)
at org.apache.catalina.core.StandardContext.startInternal(StandardContext.java:5312)
at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
Caused by: Unable to load configuration. - [unknown location]
at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:70)
at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:445)
at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:489)
... 14 more
Caused by: Unable to locate parent package [rcg.console] for [class com.tumri.rcg.actions.ConsoleAction] - [unknown location]
at org.apache.struts2.convention.PackageBasedActionConfigBuilder.getPackageConfig(PackageBasedActionConfigBuilder.java:1020)
at org.apache.struts2.convention.PackageBasedActionConfigBuilder.buildConfiguration(PackageBasedActionConfigBuilder.java:666)
at org.apache.struts2.convention.PackageBasedActionConfigBuilder.buildActionConfigs(PackageBasedActionConfigBuilder.java:348)
at org.apache.struts2.convention.ClasspathPackageProvider.loadPackages(ClasspathPackageProvider.java:53)
at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:268)
at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:67)
... 16 more
Мой с truts.xml
файл:
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
"http://struts.apache.org/dtds/struts-2.3.dtd ">
<struts>
<constant name="struts.enable.DynamicMethodInvocation" value="false" />
<constant name="struts.devMode" value="true" />
<constant name="struts.convention.default.parent.package" value="rcg.console"/>
<constant name="struts.custom.i18n.resources" value="messages" />
<package name="rcg.console" extends="struts-default, tiles-default" namespace="/"></package>
</struts>
мой web.xml
файл:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
<display-name>rcg-webapp</display-name>
<context-param>
<param-name>org.apache.tiles.impl.BasicTilesContainer.DEFINITIONS_CONFIG</param-name>
<param-value>/WEB-INF/tiles.xml</param-value>
</context-param>
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>struts2</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>
org.apache.struts2.tiles.StrutsTilesListener
</listener-class>
</listener>
</web-app>
мой tiles.xml
файл:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE tiles-definitions PUBLIC
"-//Apache Software Foundation//DTD Tiles Configuration 2.0//EN"
"http://tiles.apache.org/dtds/tiles-config_2_0.dtd">
<tiles-definitions>
<definition name="rcg.defaultLayout"
template="/layouts/default/defaultLayout.jsp">
<put-attribute name="title" value="RCG Console" />
<put-attribute name="header" value="/layouts/default/header.jsp" />
<!-- <put-attribute name="tabs" value="/layouts/default/tabs.jsp" /> -->
<put-attribute name="body" value="" />
<put-attribute name="footer" value="/layouts/default/footer.jsp" />
</definition>
<definition name="rcg.consoleHome" extends="rcg.defaultLayout">
<put-attribute name="body" value="/jsp/consoleHome.jsp" />
</definition >
</tiles-definitions>
Мой класс действий:
package com.tumri.rcg.actions;
import org.apache.log4j.Logger;
import org.apache.struts2.convention.annotation.Action;
import org.apache.struts2.convention.annotation.Actions;
import org.apache.struts2.convention.annotation.Namespace;
import org.apache.struts2.convention.annotation.ParentPackage;
import org.apache.struts2.convention.annotation.Result;
import org.apache.struts2.convention.annotation.Results;
import com.opensymphony.xwork2.ActionSupport;
@Namespace(value="/")
@ParentPackage(value="rcg.console")
@Results(value={@Result(name="success", type="tiles", location ="rcg.consoleHome")})
@Actions(value={@Action(""), @Action("console")})
public class ConsoleAction extends ActionSupport {
/**
*
*/
private static final long serialVersionUID = 4622874962298947031L;
Logger logger = Logger.getLogger(ConsoleAction.class);
@Override
public String execute() throws Exception {
System.out.println("Executing Index Action...");
logger.info("Executing Index Action...");
return SUCCESS;
}
}
1 ответ
Использовать @ParentPackage
аннотация с классом действия или пакетом Java, вы должны указать действительное имя пакета Struts в качестве атрибута значения. Если Struts не может найти указанное имя пакета, он сообщит вам об исключении, как в вашем случае
Unable to locate parent package [xxx] for [class yyy]
Это нормально, указанный пакет Struts должен существовать в конфигурации среды выполнения Struts, прежде чем поставщик конфигурации подключаемого модуля соглашения создаст свою собственную конфигурацию на основе соглашений.
Если вы измените имя пакета Struts на такой пакет, как tiles-default
или же convention-default
это будет работать, потому что эти пакеты Struts создаются с помощью поставщика конфигурации на основе XML из файлов конфигурации плагина.
Но ваш пакет не создан, потому что вы не предоставили файл конфигурации struts.xml
в ваше веб-приложение или оно не доступно диспетчеру. По умолчанию struts.xml
помещается в classpath, где он может быть загружен контекстным загрузчиком классов, или вы можете указать расположение файла конфигурации, используя config
Параметр init фильтра Struts.
<filter>
<filter-name>struts2</filter-name>
<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
<init-param>
<param-name>config</param-name>
<param-value>../../location/to/the/struts.xml,struts-default.xml,struts-plugin.xml</param-value>
</init-param>
</filter>
Типы результатов по умолчанию доступны для родительских пакетов, которые должны расширяться вашими пакетами.