/** * Add custom binders assigned to the method * * <p>Custom binders assigned to the method will be added to the binding manager instance. * * @param manager the manager to add binders to * @param method the method to evaluate for additional binders */ protected static void addMethodBinders(final BindingManager manager, final Method method) { final ControllerBinder[] binders = method.getAnnotationsByType(ControllerBinder.class); if (binders == null) { return; } for (final ControllerBinder binder : binders) { try { final Binder binderImpl = binder.value().newInstance(); if (binderImpl instanceof ControllerBinderParametersAware) { ((ControllerBinderParametersAware) binderImpl).setParameters(binder.parameters()); } manager.addBinder(binderImpl); } catch (InstantiationException | IllegalAccessException e) { manager.addBinder(new ErrorBinder(e)); } } }
protected RequestHandler processCall( final Match match, final HttpServletRequest request, final HttpServletResponse response) throws Exception { final Map<String, Object> data = new HashMap<String, Object>(); data.put("request", request); data.put("response", response); data.put("session", request.getSession()); data.put("principal", request.getUserPrincipal()); // create new binding manager final BindingManager manager = BindingManager.create(data); // add controller binders manager.addBinder(new RequestParameterBinder(request)); manager.addBinder(new PathVariableBinder(match)); manager.addBinder(new FormDataBinder(request, this.controller)); addMethodBinders(manager, this.m); final de.dentrassi.osgi.web.controller.binding.BindingManager.Call call = manager.bind(this.m, this.controller); final Object result = call.invoke(); if (result instanceof ModelAndView) { return new ModelAndViewRequestHandler( (ModelAndView) result, this.controller.getClass(), this.m); } else if (result instanceof String) { return new ModelAndViewRequestHandler( new ModelAndView((String) result), this.controller.getClass(), this.m); } else if (result == null) { return new NoOpRequestHandler(); } else { throw new IllegalStateException( String.format("Response type %s is unsupported", result.getClass())); } }