web-dev-qa-db-fra.com

ViewResolver en utilisant Java annotation

Est-il possible dans Spring 3.1.1 de configurer un résolveur de vue en utilisant Java annotations?

J'en ai terminé avec toutes les configurations en utilisant Java annotations, mais je suis bloqué sur view resolver .

Code

package com;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DriverManagerDataSource;
import javax.sql.DataSource;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import com.*;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.UrlBasedViewResolver;
import org.springframework.web.servlet.view.JstlView;

@Configuration
@ComponentScan("com")
public class AppConfig
{
    {
          //Other bean declarations
    }

    @Bean
    public UrlBasedViewResolver urlBasedViewResolver()
    {
        UrlBasedViewResolver res = new InternalResourceViewResolver();
        res.setViewClass(JstlView.class);
        res.setPrefix("/WEB-INF/");
        res.setSuffix(".jsp");

        return res;
    }
}

J'ai utilisé ce code et exécuté l'application, mais elle ne renvoie pas la vue appropriée. Cependant, si je configure un viewresolver dans le app-servlet.xml fichier, cela fonctionne très bien.

21
Ravi Jain

Votre classe doit étendre la classe WebMvcConfigurerAdapter. veuillez regarder l'exemple ci-dessous

@Configuration
@ComponentScan(basePackages="com")
@EnableWebMvc
public class MvcConfiguration extends WebMvcConfigurerAdapter{

    @Bean
    public ViewResolver getViewResolver(){
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/views/");
        resolver.setSuffix(".jsp");
        return resolver;
    }
}
33
Ramesh Kotha

J'ai testé votre scénario avec Spring 4.3.4 et cela fonctionne bien. Je suggérerais de vérifier les paquets que vous numérisez et que AppConfig est correctement fourni. Je joins tous les fichiers à partir de votre AppConfig. Pourtant, il est bon d'étendre WebMvcConfigurerAdapter. Le code source joint n'est pas idéal, il est simpliste et ne sert qu'à reproduire le problème que vous avez signalé.

À partir d'AppConfig:

package com;

import org.springframework.context.annotation.*;
import org.springframework.web.servlet.view.*;

@Configuration
@ComponentScan("com")
public class AppConfig {
    @Bean
    public UrlBasedViewResolver getViewResovler() {
        UrlBasedViewResolver urlBasedViewResolver = new UrlBasedViewResolver();
        urlBasedViewResolver.setViewClass(JstlView.class);
        urlBasedViewResolver.setPrefix("/WEB-INF/jsp/");
        urlBasedViewResolver.setSuffix(".jsp");
        return urlBasedViewResolver;
    }

}

Ensuite:

package com;

import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;

    public class WebInit extends AbstractAnnotationConfigDispatcherServletInitializer {

        @Override
        protected Class<?>[] getRootConfigClasses() {
            return new Class<?>[] { };
        }

        @Override
        protected Class<?>[] getServletConfigClasses() {
            return new Class<?>[] { AppConfig.class };
        }

        @Override
        protected String[] getServletMappings() {
            return new String[] { "/" };
        }
    }

Finalement:

package com;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;

@Controller
public class MainController {

    @RequestMapping("/")
    public ModelAndView asdf() {
        return new ModelAndView("ABC");
    }
}
1
Witold Kaczurba

Le problème avec ce qui précède est que le DispatcherServlet.initViewResolvers est appelé avant la définition du bean getViewResolver et qu'il ne peut pas trouver le bean, il n'ajoute donc jamais le résolveur de vue.

Si vous déplacez la définition de bean dans une définition xml, elle est récupérée. Pour une raison quelconque, la classe MvcConfiguration que vous avez définie ne déclenche pas une actualisation DispatcherServlet si aucun ViewResolvers n'est défini dans le XML.

0
Allen