Are you defining your own ComponentRequestFilter interface? As you have included the code for that I am assuming you have.
You have to implement Tapestry's ComponentRequestFilter, not your own as you can't contribute to the RequestHandler any other implementation. regards Taha On 06-Aug-2013, at 5:53 PM, Will N. <llcool_wil...@yahoo.fr> wrote: > Am 06.08.2013 14:13, schrieb Thiago H de Paula Figueiredo: >> I'm sorry, I should have asked for your ComponentRequestFilter >> implementation source too. ;) >> >> On Tue, 06 Aug 2013 08:31:15 -0300, Will N. <llcool_wil...@yahoo.fr> wrote: >> >>> Am 06.08.2013 13:25, schrieb Thiago H de Paula Figueiredo: >>>> On Tue, 06 Aug 2013 05:10:37 -0300, Will N. <llcool_wil...@yahoo.fr> wrote: >>>> >>>>> Hi, >>>> >>>> Hi! >>>> >>>>> I am trying secure some pages of my application as shown in this >>>>> tutorial. http://tapestryjava.blogspot.co.uk/search/label/security >>>>> But I am having following error message when I start the application. >>>>> Since the RequiresLoginFilte class implements the ComponentRequestFilter >>>>> interface, I am confused about the coertion error! >>>> >>>> The error is weird. Could you post your >>>> PmsModule.contributeComponentRequestHandler() method >>> /** >>> * This module is automatically included as part of the Tapestry IoC >>> Registry, >>> * it's a good place to configure and extend Tapestry, or to place your own >>> * service definitions. spring >>> */ >>> public class PmsModule { >>> // public static void bind(ServiceBinder binder) { >>> // // binder.bind(MyServiceInterface.class, MyServiceImpl.class); >>> // >>> // // Make bind() calls on the binder object to define most IoC >>> services. >>> // // Use service builder methods (example below) when the >>> implementation >>> // // is provided inline, or requires more initialization than simply >>> // // invoking the constructor. >>> // binder.bind(ArbeitspaketDao.class, ArbeitspaketDaoImpl.class); >>> // binder.bind(AufgabeDao.class, AufgabeDaoImpl.class); >>> // binder.bind(BasicDao.class, BasicDaoImpl.class); >>> // binder.bind(FunktionDao.class, FunktionDaoImpl.class); >>> //// binder.bind(GrantedAuthorityBeanDao.class, >>> //// GrantedAuthorityBeanDaoImpl.class); >>> // binder.bind(MitarbeiterDao.class, MitarbeiterDaoImpl.class); >>> // binder.bind(MitarbeiterProjektDao.class, >>> // MitarbeiterProjektDaoImpl.class); >>> // binder.bind(ModulDao.class, ModulDaoImpl.class); >>> // binder.bind(PersonMonatDao.class, PersonMonatDaoImpl.class); >>> // binder.bind(UserDataDao.class, UserDataDaoImpl.class); >>> // binder.bind(ProjektDao.class, ProjektDaoImpl.class); >>> // binder.bind(UnteraufgabeDao.class, UnteraufgabeDaoImpl.class); >>> // binder.bind(UnterunteraufgabeDao.class, >>> UnterunteraufgabeDaoImpl.class); >>> // >>> // } >>> >>> public static void contributeFactoryDefaults( >>> MappedConfiguration<String, Object> configuration) { >>> // The application version number is incorprated into URLs for some >>> // assets. Web browsers will cache assets because of the far future >>> // expires >>> // header. If existing assets are changed, the version number should >>> // also >>> // change, to force the browser to download new versions. This >>> overrides >>> // Tapesty's default >>> // (a random hexadecimal number), but may be further overriden by >>> // DevelopmentModule or >>> // QaModule. >>> configuration.override(SymbolConstants.APPLICATION_VERSION, >>> "1.0-SNAPSHOT"); >>> } >>> >>> public static void contributeApplicationDefaults( >>> MappedConfiguration<String, Object> configuration) { >>> // Contributions to ApplicationDefaults will override any >>> contributions >>> // to >>> // FactoryDefaults (with the same key). Here we're restricting the >>> // supported >>> // locales to just "en" (English). As you add localised message >>> catalogs >>> // and other assets, >>> // you can extend this list of locales (it's a comma separated >>> series of >>> // locale names; >>> // the first locale name is the default when there's no reasonable >>> // match). >>> // configuration.add(SymbolConstants.SUPPORTED_LOCALES, "en"); >>> configuration.add(SymbolConstants.SUPPORTED_LOCALES, "de"); >>> configuration.add(SymbolConstants.COMPRESS_WHITESPACE, "true"); >>> >>> } >>> >>> /** >>> * This is a service definition, the service will be named >>> "TimingFilter". >>> * The interface, RequestFilter, is used within the RequestHandler >>> service >>> * pipeline, which is built from the RequestHandler service >>> configuration. >>> * Tapestry IoC is responsible for passing in an appropriate Logger >>> * instance. Requests for static resources are handled at a higher >>> level, so >>> * this filter will only be invoked for Tapestry related requests. >>> * <p/> >>> * <p/> >>> * Service builder methods are useful when the implementation is inline >>> as >>> * an inner class (as here) or require some other kind of special >>> * initialization. In most cases, use the static bind() method instead. >>> * <p/> >>> * <p/> >>> * If this method was named "build", then the service id would be taken >>> from >>> * the service interface and would be "RequestFilter". Since Tapestry >>> * already defines a service named "RequestFilter" we use an explicit >>> * service id that we can reference inside the contribution method. >>> */ >>> public RequestFilter buildTimingFilter(final Logger log) { >>> return new RequestFilter() { >>> public boolean service(Request request, Response response, >>> RequestHandler handler) throws IOException { >>> long startTime = System.currentTimeMillis(); >>> >>> try { >>> // The responsibility of a filter is to invoke the >>> // corresponding method >>> // in the handler. When you chain multiple filters >>> together, >>> // each filter >>> // received a handler that is a bridge to the next >>> filter. >>> >>> return handler.service(request, response); >>> } finally { >>> long elapsed = System.currentTimeMillis() - startTime; >>> >>> log.info(String.format("Request time: %d ms", elapsed)); >>> } >>> } >>> }; >>> } >>> >>> /** >>> * This is a contribution to the RequestHandler service configuration. >>> This >>> * is how we extend Tapestry using the timing filter. A common use for >>> this >>> * kind of filter is transaction management or security. The @Local >>> * annotation selects the desired service by type, but only from the >>> same >>> * module. Without @Local, there would be an error due to the other >>> * service(s) that implement RequestFilter (defined in other modules). >>> */ >>> public void >>> contributeRequestHandler(OrderedConfiguration<RequestFilter> configuration, >>> @Local RequestFilter filter) { >>> // Each contribution to an ordered configuration has a name, When >>> // necessary, you may >>> // set constraints to precisely control the invocation order of the >>> // contributed filter >>> // within the pipeline. >>> >>> configuration.add("Timing", filter); >>> } >>> >>> >>> @SuppressWarnings("unchecked") >>> public static void >>> contributeComponentRequestHandler(OrderedConfiguration configuration) { >>> configuration.addInstance("RequiresLogin", >>> RequiresLoginFilter.class); >>> >>> } >>> >>> >>> >>> >>> >>> >>> } >>> >>> --------------------------------------------------------------------- >>> To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org >>> For additional commands, e-mail: users-h...@tapestry.apache.org >>> >> >> > > > > import java.io.IOException; > > import org.apache.tapestry5.services.ComponentEventRequestParameters; > import org.apache.tapestry5.services.ComponentRequestHandler; > import org.apache.tapestry5.services.PageRenderRequestParameters; > > > /** > * Filter interface for {@link > org.apache.tapestry5.services.ComponentRequestHandler}. > */ > /** > * Our implementation of this filter will check the page referenced in the > request to see if it has the annotation. > * If the annotation is present and the user has not yet logged in, we'll > redirect to the Login page. > * When a redirect is not necessary, we delegate to the next handler in the > pipeline2: > */ > public interface ComponentRequestFilter > { > /** > * Handler for a component action request which will trigger an event on a > component and use the return value to > * send a response to the client (typically, a redirect to a page render > URL). > * > * @param parameters defining the request > * @param handler next handler in the pipeline > */ > void handleComponentEvent(ComponentEventRequestParameters parameters, > ComponentRequestHandler handler) > throws IOException; > > /** > * Invoked to activate and render a page. In certain cases, based on > values returned when activating the page, a > * {@link org.apache.tapestry5.services.ComponentEventResultProcessor} may > be used to send an alternate response > * (typically, a redirect). > * > * @param parameters defines the page name and activation context > * @param handler next handler in the pipeline > */ > void handlePageRender(PageRenderRequestParameters parameters, > ComponentRequestHandler handler) throws IOException; > } > > > > > > > import java.io.IOException; > > import org.apache.tapestry5.Link; > import org.apache.tapestry5.runtime.Component; > import org.apache.tapestry5.services.ComponentEventRequestParameters; > import org.apache.tapestry5.services.ComponentRequestHandler; > import org.apache.tapestry5.services.ComponentSource; > import org.apache.tapestry5.services.PageRenderLinkSource; > import org.apache.tapestry5.services.PageRenderRequestParameters; > import org.apache.tapestry5.services.Response; > > > import com.example.pms.annotations.*; > > > public class RequiresLoginFilter implements ComponentRequestFilter { > > private PageRenderLinkSource renderLinkSource; > > private ComponentSource componentSource; > > private Response response; > > // private final AuthenticationService authService; > private AuthenticatorImp authService; > > > public void PageAccessFilter(PageRenderLinkSource renderLinkSource, > ComponentSource componentSource, > Response response, AuthenticatorImp > authService) { > > this.renderLinkSource = renderLinkSource; > this.componentSource = componentSource; > this.response = response; > this.authService = authService; > > } > > public void handleComponentEvent( > ComponentEventRequestParameters parameters, > ComponentRequestHandler handler) throws IOException { > > if (dispatchedToLoginPage(parameters.getActivePageName())) { > return; > } > > handler.handleComponentEvent(parameters); > > } > > public void handlePageRender(PageRenderRequestParameters parameters, > ComponentRequestHandler handler) throws IOException { > > if (dispatchedToLoginPage(parameters.getLogicalPageName())) { > return; > } > > handler.handlePageRender(parameters); > } > > private boolean dispatchedToLoginPage(String pageName) throws IOException { > > if (authService.isLoggedIn()) { > return false; > } > > Component page = componentSource.getPage(pageName); > > if (! page.getClass().isAnnotationPresent(RequiresLogin.class)) { > return false; > } > > Link link = renderLinkSource.createPageRenderLink("Index"); > > response.sendRedirect(link); > > return true; > } > } > > > > --------------------------------------------------------------------- > To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org > For additional commands, e-mail: users-h...@tapestry.apache.org > --------------------------------------------------------------------- To unsubscribe, e-mail: users-unsubscr...@tapestry.apache.org For additional commands, e-mail: users-h...@tapestry.apache.org