type plugin example struts2 tiles

struts2 - example - Struts 2 Tile y REST plugin



struts2 rest plugin example (1)

Estoy tratando de ejecutar mi proyecto Struts2 con Tiles y REST Plugin, pero simplemente no puedo hacer que funcione.

He revisado la documentación de ambos y creo que lo estoy haciendo bien. aquí están mis archivos:

web.xml

<?xml version="1.0" encoding="UTF-8"?> <web-app metadata-complete="true" version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <!-- listeners --> <listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <listener> <listener-class>org.apache.struts2.tiles.StrutsTilesListener</listener-class> </listener> <!-- context params --> <context-param> <param-name>org.apache.tiles.impl.BasicTilesContainer.DEFINITIONS_CONFIG</param-name> <param-value>/WEB-INF/tiles-tradesman.xml</param-value> </context-param> <context-param> <param-name>contextConfigLocation</param-name> <param-value>classpath*:spring-tradesman.xml</param-value> </context-param> <!-- filters --> <filter> <filter-name>struts2</filter-name> <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class> </filter> <!-- filter mappings --> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>

struts.xml

<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.devMode" value="true" /> <!-- RESTful plugin setup --> <constant name="struts.mapper.class" value="rest" /> <constant name="struts.convention.action.suffix" value="Controller"/> <constant name="struts.convention.action.mapAllMatches" value="true"/> <constant name="struts.convention.default.parent.package" value="rest-default"/> <constant name="struts.convention.package.locators" value="tp"/> <package name="tradesman" namespace="/beta/tradesman" extends="default"> <result-types> <result-type name="json" class="org.apache.struts2.json.JSONResult"/> <result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult" /> </result-types> <interceptors> <interceptor name="json" class="org.apache.struts2.json.JSONInterceptor"/> </interceptors> </package> </struts>

JobAlertsController.java

package uk.co.ratedpeople.tp; import com.opensymphony.xwork2.ActionSupport; import java.util.logging.Logger; import org.apache.struts2.convention.annotation.Action; import org.apache.struts2.convention.annotation.Result; public class JobAlertsController extends ActionSupport { private static final Logger LOGGER = Logger.getLogger(JobAlertsController.class.getName()); @Action(results={ @Result(name = SUCCESS, location = "tradesman.page.jobalerts", type = "tiles") }) public String index() { LOGGER.info("executing index action..."); LOGGER.info("leaving index action..."); return SUCCESS; } }

Cuando intento ejecutar el proyecto obtengo este error:

SEVERE: Exception starting filter struts2 Unable to load configuration. - [unknown location] at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:437) at org.apache.struts2.dispatcher.FilterDispatcher.init(FilterDispatcher.java:195) at org.apache.catalina.core.ApplicationFilterConfig.initFilter(ApplicationFilterConfig.java:273) at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:254) at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:372) at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:98) at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:4542) at org.apache.catalina.core.StandardContext$2.call(StandardContext.java:5220) at org.apache.catalina.core.StandardContext$2.call(StandardContext.java:5215) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) at java.util.concurrent.FutureTask.run(FutureTask.java:138) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:619) Caused by: Unable to load configuration. - [unknown location] at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:69) at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:380) at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:424) ... 13 more Caused by: The Result type [tiles] which is defined in the Result annotation on the class [class uk.co.ratedpeople.tp.JobAlertsController] or determined by the file extension or is the default result type for the PackageConfig of the action, could not be found as a result-type defined for the Struts/XWork package [uk.co.ratedpeople.tp#rest-default#] - [unknown location] at org.apache.struts2.convention.DefaultResultMapBuilder.createResultConfig(DefaultResultMapBuilder.java:427) at org.apache.struts2.convention.DefaultResultMapBuilder.createFromAnnotations(DefaultResultMapBuilder.java:399) at org.apache.struts2.convention.DefaultResultMapBuilder.build(DefaultResultMapBuilder.java:200) at org.apache.struts2.convention.PackageBasedActionConfigBuilder.createActionConfig(PackageBasedActionConfigBuilder.java:864) at org.apache.struts2.convention.PackageBasedActionConfigBuilder.buildConfiguration(PackageBasedActionConfigBuilder.java:650) at org.apache.struts2.convention.PackageBasedActionConfigBuilder.buildActionConfigs(PackageBasedActionConfigBuilder.java:335) at org.apache.struts2.convention.ClasspathPackageProvider.loadPackages(ClasspathPackageProvider.java:53) at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reloadContainer(DefaultConfiguration.java:215) at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:66) ... 15 more 27-Jul-2011 17:07:07 org.apache.catalina.core.ApplicationContext log INFO: Closing Spring root WebApplicationContext

Estoy seguro de que estoy haciendo algo realmente estúpido, pero no puedo verlo yo mismo. ¿Nadie?


En primer lugar, sugiero que coloque las acciones de sus puntales en un paquete llamado simplemente puntales, he tenido muchos menos problemas de configuración cuando uso la arquitectura de plugins de convenciones estándar. Mueva sus acciones a un paquete como:

uk.co.ratedpeople.struts

en lugar de

uk.co.ratedpeople.tp;

Cuanto menor sea la configuración fuera de la caja, mejor será normalmente. Esto también elimina la necesidad de esto:

<constant name="struts.convention.package.locators" value="tp"/>

En segundo lugar, parte de su problema es con su configuración xml:

<struts> <constant name="struts.devMode" value="true" /> <!-- RESTful plugin setup --> <constant name="struts.mapper.class" value="rest" /> <constant name="struts.convention.action.suffix" value="Controller"/> <constant name="struts.convention.action.mapAllMatches" value="true"/> <constant name="struts.convention.default.parent.package" value="rest-default"/> <constant name="struts.convention.package.locators" value="tp"/> <package name="tradesman" namespace="/beta/tradesman" extends="default"> <result-types> <result-type name="json" class="org.apache.struts2.json.JSONResult"/> <result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult" /> </result-types> <interceptors> <interceptor name="json" class="org.apache.struts2.json.JSONInterceptor"/> </interceptors> </package>

Pruebe algo como esto en su lugar (siempre que haya movido sus acciones como se sugirió anteriormente):

<struts> <constant name="struts.devMode" value="true" /> <!-- RESTful plugin setup --> <constant name="struts.mapper.class" value="rest" /> <constant name="struts.convention.action.suffix" value="Controller"/> <constant name="struts.convention.action.mapAllMatches" value="true"/> <constant name="struts.convention.default.parent.package" value="tradesman"/> <package name="tradesman" namespace="/beta/tradesman" extends="rest-default"> <result-types> <result-type name="json" class="org.apache.struts2.json.JSONResult"/> <result-type name="tiles" class="org.apache.struts2.views.tiles.TilesResult" /> </result-types> </package> </struts>

Observe la constante name = "struts.convention.default.parent.package" value = "tradesman" que se refiere al paquete debajo de él que define sus tipos de resultados y extiende el resto-default. Esto debería eliminar los errores de definición de resultados de los mosaicos.

También he tenido problemas al usar el filtro struts que tienes en tu web.xml, cambiaría desde:

<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>

a:

<filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>