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 .
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.
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;
}
}
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");
}
}
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.