Я не могу получить HTML-страницу с помощью моих методов RestController - PullRequest
0 голосов
/ 22 мая 2019

все! Извините, я новичок в технологиях Spring. Я использую SpringMVC, и я не могу получить HTML-страницу с помощью моих методов RestController, но объекты в JSON или объектах String я получаю успешно. Любая помощь, почему я постоянно получаю это сообщение в журнале Каталина, когда я хочу получить HTML-страницу?

org.springframework.web.servlet.DispatcherServlet.noHandlerFound No mapping for GET /WEB-INF/pages/login.html

Соответствующие файлы HTML существуют, но mb HandlerMapping не находит их. Что я должен добавить в свой проект, чтобы получить страницу HTML в моем браузере при посещении URL http://localhost:8080/login?

Я использую конфигурацию Java вместо файлов XML. Весь мой проект находится в GitHub: https://github.com/OlegSandro/first-rest-project/tree/security. Некоторые основные детали показаны ниже.

Мой контроллер:

package com.example.controller;

import com.example.model.User;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;

import java.util.concurrent.atomic.AtomicLong;

@RestController
public class TestController {

    @GetMapping("/profile")
    public String profile() {
        return "profile";
    }

    @GetMapping("/home")
    public String home() {
        return "/home";
    }

    @GetMapping("/login")
    public ModelAndView login() {
        User user = new User();
        user.setLogin("superuser");
        user.setPassword("124567890");
        user.setId_role(2);
        return new ModelAndView("login", "login", user);
        //return new ModelAndView("login");
    }
}

Мой 1-й класс конфигурации:

package com.example.configuration;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
import org.springframework.web.servlet.view.InternalResourceViewResolver;
import org.springframework.web.servlet.view.JstlView;

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = { "com.example.controller" })
//@ComponentScan(basePackages = "com.example")
public class WebConfiguration extends WebMvcConfigurerAdapter {

    @Bean
    public ViewResolver viewResolver()
    {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setViewClass(JstlView.class);
        viewResolver.setPrefix("/WEB-INF/pages/");
        viewResolver.setSuffix(".html");
        return viewResolver;
    }
}

Мой второй класс конфигурации:

package com.example.configuration;

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

public class WebInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

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

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

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

Мой третий класс конфигурации (для функциональности Hibernate, потому что ORM - это еще одна часть моего проекта):

package com.example.configuration;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.*;
import org.springframework.core.env.Environment;
import org.springframework.orm.hibernate5.*;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import static org.hibernate.cfg.AvailableSettings.*;

import java.util.Properties;

@Configuration
@PropertySource("classpath:db.properties")
@EnableTransactionManagement
@ComponentScans(value = { @ComponentScan("com.example.dao"),  @ComponentScan("com.example.service")})
public class AppConfiguraion {

    @Autowired
    private Environment env;

    @Bean
    public LocalSessionFactoryBean getSessionFactory(){
        LocalSessionFactoryBean factoryBean = new LocalSessionFactoryBean();

        Properties props = new Properties();
        // Setting JDBC properties
        props.put(DRIVER, env.getProperty("mysql.driver"));
        props.put(URL, env.getProperty("mysql.url"));
        props.put(USER, env.getProperty("mysql.user"));
        props.put(PASS, env.getProperty("mysql.password"));

        // Setting Hibernate properties
        props.put(SHOW_SQL, env.getProperty("hibernate.show_sql"));
        props.put(HBM2DDL_AUTO, env.getProperty("hibernate.hbm2ddl.auto"));

        // Setting C3P0 properties
        props.put(C3P0_MIN_SIZE, env.getProperty("hibernate.c3p0.min_size"));
        props.put(C3P0_MAX_SIZE, env.getProperty("hibernate.c3p0.max_size"));
        props.put(C3P0_ACQUIRE_INCREMENT, env.getProperty("hibernate.c3p0.acquire_increment"));
        props.put(C3P0_TIMEOUT, env.getProperty("hibernate.c3p0.timeout"));
        props.put(C3P0_MAX_STATEMENTS, env.getProperty("hibernate.c3p0.max_statements"));

        factoryBean.setHibernateProperties(props);
        factoryBean.setPackagesToScan("com.example.model");

        return factoryBean;
    }

    @Bean
    public HibernateTransactionManager getTransactionManager(){
        HibernateTransactionManager transactionManager = new HibernateTransactionManager();
        transactionManager.setSessionFactory(getSessionFactory().getObject());
        return transactionManager;
    }
}

Спасибо за аванс за любую помощь!

Ответы [ 2 ]

0 голосов
/ 23 мая 2019

Проблема решена. Я предпринял следующие шаги:

  1. Я изменил @RestController на @Controller.

  2. Я заменил viewResolver.setSuffix(".html"); на viewResolver.setSuffix(".jsp"); в моем методе, который возвращает InternalResourceViewResolver.

  3. Я заменил расширение всех моих html-файлов с html на jsp.

Проект работает, но я не знаю, почему он не работает с HTML-файлами. Но моей главной проблемой было получить любой вид в моем браузере.

0 голосов
/ 22 мая 2019

Вы хотите:

  1. используйте @Controller not @ RestController
  2. добавить уровень класса @ RequestMapping
...