javaspringspring-mvctomcatapache-tiles

Spring Mvc Java Could not resolve view with name 'home' in servlet with name 'dispatcher'


I have problem with my first app. I try to solve this for several hours. Any idea??

HTTP Status 500 – Internal Server Error

Type Exception Report

Message Could not resolve view with name 'home' in servlet with name dispatcher

Description The server encountered an unexpected condition that prevented it from fulfilling the request.

Exception

javax.servlet.ServletException: Could not resolve view with name 'home' in servlet with name 'dispatcher' org.springframework.web.servlet.DispatcherServlet.render(DispatcherServlet.java:1251) org.springframework.web.servlet.DispatcherServlet.processDispatchResult(DispatcherServlet.java:1037) org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:980) org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) javax.servlet.http.HttpServlet.service(HttpServlet.java:634) org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) javax.servlet.http.HttpServlet.service(HttpServlet.java:741) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)

Note The full stack trace of the root cause is available in the server logs. Apache Tomcat/9.0.1

//Controller

public class SystemController {


@Autowired
private SysDeaUseService sysDeaUseService;

@RequestMapping(value = {"/","/home"}, method = RequestMethod.GET)
public String home(ModelMap model) {
    return "home";
}

@RequestMapping(path = "/system", method = RequestMethod.GET)
public String sys(ModelMap model) {
    return "system";
}

@RequestMapping(path = "/system/get", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Map<String, Object>> getAllSystem() {
    Map<String, Object> resultMap = new HashMap<>();
    resultMap.put("Result", "Ok");
    resultMap.put("Records", sysDeaUseService.getAllSystem());
    return new ResponseEntity<Map<String, Object>>(resultMap, HttpStatus.OK);
}

@RequestMapping(path = "/system/save-edit", method = RequestMethod.POST, consumes = MediaType.APPLICATION_FORM_URLENCODED_VALUE
        , produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Map<String, Object>> saveSystem(@ModelAttribute System system) {
    sysDeaUseService.saveSystem(system);
    Map<String, Object> resultMap = new HashMap<>();
    resultMap.put("Result", "Ok");
    resultMap.put("Records", sysDeaUseService.getAllSystem());
    return new ResponseEntity<Map<String, Object>>(resultMap, HttpStatus.OK);
}

@RequestMapping(path = "/system/delete", method = RequestMethod.POST)
public ResponseEntity<Map<String, Object>> deleteSystem(Integer systemId) {
    sysDeaUseService.deleteSystem(systemId);
    Map<String, Object> resultMap = new HashMap<>();
    resultMap.put("Result", "Ok");
    return new ResponseEntity<Map<String, Object>>(resultMap, HttpStatus.OK);

}

//AppConfig

@Configuration
@EnableWebMvc
@EnableTransactionManagement
@PropertySource({"classpath:application.properties"})
@ComponentScan(basePackages = {"com.wn"})
public class AppConfig extends WebMvcConfigurerAdapter {

@Autowired
private Environment env;

@Bean
public TilesViewResolver getTilesViewResolver() {
    TilesViewResolver tilesViewResolver = new TilesViewResolver();
    tilesViewResolver.setPrefix("/WEB-INF/Views/Page");
    tilesViewResolver.setSuffix(".jsp");
    tilesViewResolver.setViewClass(TilesView.class);
    return tilesViewResolver;
}

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/static/**").addResourceLocations("/static/");
}

@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder().indentOutput(true);
    converters.add(new MappingJackson2HttpMessageConverter(builder.build()));
}

private Properties setHibernateProperties() {
    Properties props = new Properties() {
        {
            setProperty("hibernate.hbm2ddl.auto", env.getProperty("hibernate.hbm2ddl.auto"));
            setProperty("hibernate.dialect", env.getProperty("hibernate.dialect"));
            setProperty("hibernate.generate_statistics", "true");
            setProperty("hibernate.show.sql", "true");
        }
    };
    return props;
}

@Bean
public LocalSessionFactoryBean sessionFactory() {
    LocalSessionFactoryBean sessionFactoryBuilder = new LocalSessionFactoryBean();

    sessionFactoryBuilder.setDataSource(prepareDataSource());
    sessionFactoryBuilder.setPackagesToScan(new String[]{"com.wn.entity"});
    sessionFactoryBuilder.setHibernateProperties(setHibernateProperties());

    return sessionFactoryBuilder;
}

@Bean
public DataSource prepareDataSource() {
    BasicDataSource dataSource = new BasicDataSource();
    dataSource.setDriverClassName(env.getProperty("jdb.driver.class.name"));
    dataSource.setUrl(env.getProperty("jdbc.url"));
    dataSource.setUsername(env.getProperty("jdbc.user.name"));
    dataSource.setPassword(env.getProperty("jdbc.password"));

    return dataSource;
}

@Bean
public HibernateTransactionManager transactionManager(SessionFactory sessionFactory) {

    HibernateTransactionManager txManager = new HibernateTransactionManager();
    txManager.setSessionFactory(sessionFactory);

    return txManager;
}

@Bean
public PersistenceExceptionTranslationPostProcessor exceptionTranslation() {
    return new PersistenceExceptionTranslationPostProcessor();
}

@Bean
public WebMvcConfigurer corsConfigurer() {
    return new WebMvcConfigurerAdapter() {
        @Override
        public void addCorsMappings(CorsRegistry registry) {
            registry.addMapping("/**");
        }
    };
}

@Bean
public TilesConfigurer getTilesConfigurer() {
    TilesConfigurer tilesConfigurer = new TilesConfigurer();
    tilesConfigurer.setCheckRefresh(true);
    tilesConfigurer.setDefinitionsFactoryClass(TilesDefinitionsConfig.class);
    return tilesConfigurer;
}

//ApplicationInitializer

public class ApplicationInitializer implements WebApplicationInitializer {

   @Override
   public void onStartup(ServletContext container) throws ServletException {

    AnnotationConfigWebApplicationContext rootCtx = new AnnotationConfigWebApplicationContext();

    rootCtx.register(AppConfig.class);
    container.addListener(new ContextLoaderListener(rootCtx));

    AnnotationConfigWebApplicationContext annotationConfigWebAppCtx = new AnnotationConfigWebApplicationContext();

    annotationConfigWebAppCtx.register(DispatcherServlet.class);

    ServletRegistration.Dynamic servlet = container.addServlet("dispatcher", new DispatcherServlet(rootCtx));

    servlet.setLoadOnStartup(1);
    servlet.addMapping("/");
}

//TilesDefinitionConfig

public final class TilesDefinitionsConfig implements DefinitionsFactory{

private static final Map<String,Definition> tilesDefinitions = new HashMap<>();
private static final Attribute BASE_TEMPLATE = new Attribute("/WEB-INF/Views/tiles/layouts/layout.jsp");

@Override
public Definition getDefinition(String name, Request tilesContext) {
    return tilesDefinitions.get(name);
}

private static void addDefaultLayoutDef(String name, String title, String body) {
    Map<String, Attribute> attributes = new HashMap<>();

    attributes.put("title", new Attribute(title));
    attributes.put("header", new Attribute("/WEB-INF/Views/tiles/template/header.jsp"));
    attributes.put("menu", new Attribute("/WEB-INF/Views/tiles/template/menu.jsp"));
    attributes.put("body", new Attribute(body));
    attributes.put("footer", new Attribute("/WEB-INF/Views/tiles/template/footer.jsp"));

    tilesDefinitions.put(name, new Definition(name, BASE_TEMPLATE, attributes));
}

public static void addDefinitions(){
    addDefaultLayoutDef("home","Home", "/WEB-INF/Views/Page/home.jsp");
}

public static void addDefinitionsSystem() {
    addDefaultLayoutDef("system","Systemy", "/WEB-INF/Views/Page/system.jsp");
}

public static void addDefinitionsDeal() {
    addDefaultLayoutDef("deal","Umowy", "/WEB-INF/Views/Page/deal.jsp");
}

public static void addDefinitionsContact() {
    addDefaultLayoutDef("contact","Kontakt", "/WEB-INF/Views/Page/contact.jsp");
}

}


Solution

  • I found where was a problem.

    If I configure Tiles in class - i need :

    <dependency>
            <groupId>org.apache.tomcat</groupId>
            <artifactId>tomcat-catalina</artifactId>
            <version>9.0.2</version>
        </dependency> 
    

    tiles.xml does not need