javaspringspring-mvcdwr

DWR Spring-MVC 4.0.5 java based configuration


I am trying to include dwr in my project that uses spring mvc 4.0.5. Java based configurations are used in project. for java based configurations I am using following lines of code in MVCConfiguration.

@Bean
    public DwrController dwrController(){
        Map<String,String> configParam = new HashMap<String, String>();
        configParam.put("activeReverseAjaxEnabled","true");

        DwrController dwrController = new DwrController();
        dwrController.setDebug(true);
        dwrController.setConfigParams(configParam);
/*
        AnnotationsConfigurator annotationsConfigurator = new AnnotationsConfigurator();
        annotationsConfigurator.configure();
        dwrController.setConfigurators(configurators);
*/
        List<Configurator> configurators = new ArrayList<Configurator>();
        configurators.add(annotationsConfigurator);
        return dwrController;
    }
    @Bean
    public BeanNameUrlHandlerMapping beanNameUrlHandlerMapping(){
        BeanNameUrlHandlerMapping beanNameUrlHandlerMapping = new BeanNameUrlHandlerMapping();
        return beanNameUrlHandlerMapping;
    }
    @Bean
    public DwrHandlerMapping dwrHandlerMapping(){
        Map<String,String> urlMap = new HashMap<String, String>();
        urlMap.put("/dwr/**/*","dwrController");

        DwrHandlerMapping dwrHandlerMapping = new DwrHandlerMapping();
        dwrHandlerMapping.setAlwaysUseFullPath(true);
        dwrHandlerMapping.setUrlMap(urlMap);
        return dwrHandlerMapping;
    }

WebApplicationInitializer extending class i have added mapping for dwr requests.

    ServletRegistration.Dynamic dispatcher = container.addServlet("dispatcher", new DispatcherServlet(dispatcherContext));
    dispatcher.setLoadOnStartup(1);
    dispatcher.addMapping("/dwr/*");
    dispatcher.addMapping("/");

But on deployment it shows error stating "The required 'configurators' property should be set". Can you please suggest if the configuration requires any modifications also how to set the configurators.

Changed dwrController() method to :

@Bean
    @Autowired
    public DwrController dwrController(BeanFactory beanFactory){
        Map<String,String> configParam = new HashMap<String, String>();
        configParam.put("activeReverseAjaxEnabled","true");

        DwrController dwrController = new DwrController();
        dwrController.setDebug(true);
        dwrController.setConfigParams(configParam);

        AnnotationsConfigurator annotationsConfigurator = new AnnotationsConfigurator();
        SpringContainer springContainer = new SpringContainer();
        springContainer.setBeanFactory(beanFactory);
        annotationsConfigurator.configure(springContainer);
        List<Configurator> configurators = new ArrayList<Configurator>();
        configurators.add(annotationsConfigurator);
        dwrController.setConfigurators(configurators);
        return dwrController;
    }

Now application is getting deployed but for /dwr/engine.js and other requests it is giving error The requested resource is not available.

Thanks.


Solution

  • I finally got the working configuration. Here is my cofiguration class's code

        @Bean
        public DwrController dwrController(ApplicationContext applicationContext){
    
            BeanDefinitionRegistry beanDefinitionRegistry = (BeanDefinitionRegistry)applicationContext.getAutowireCapableBeanFactory();
            Map<String,String> configParam = new HashMap<String, String>();
            configParam.put("activeReverseAjaxEnabled","true");
    
            ClassPathBeanDefinitionScanner scanner = new DwrClassPathBeanDefinitionScanner(beanDefinitionRegistry);
            scanner.addIncludeFilter(new AnnotationTypeFilter(RemoteProxy.class));
            scanner.addIncludeFilter(new AnnotationTypeFilter(DataTransferObject.class));
            scanner.addIncludeFilter(new AnnotationTypeFilter(GlobalFilter.class));
            scanner.scan("package.to.scan");
    
            DwrController dwrController = new DwrController();
            dwrController.setDebug(true);
            dwrController.setConfigParams(configParam);
    
            SpringConfigurator springConfigurator = new SpringConfigurator();
            List<Configurator> configurators = new ArrayList<Configurator>();
            configurators.add(springConfigurator);
            dwrController.setConfigurators(configurators);
    
    
            return dwrController;
        }
        @Bean
        public BeanNameUrlHandlerMapping beanNameUrlHandlerMapping(){
            BeanNameUrlHandlerMapping beanNameUrlHandlerMapping = new BeanNameUrlHandlerMapping();
            return beanNameUrlHandlerMapping;
        }
        @Bean
        public DwrHandlerMapping dwrHandlerMapping(DwrController dwrController){
            Map<String,DwrController> urlMap = new HashMap<String, DwrController>();
            urlMap.put("/dwr/**/*",dwrController);
    
            DwrHandlerMapping dwrHandlerMapping = new DwrHandlerMapping();
            dwrHandlerMapping.setAlwaysUseFullPath(true);
            dwrHandlerMapping.setUrlMap(urlMap);
            return dwrHandlerMapping;
        }
    

    Added dispatcher mapping in WebApplicationInitializer implementing class as

    dispatcher.addMapping("/dwr/*");
    dispatcher.addMapping("/");
    

    Note : DwrClassPathBeanDefinitionScanner will skip scan of @Controller,@Service,@Repository,@Component so do not use @RemoteProxy along with anyone of these spring annotations.