Установите приветственный файл Spring REST Controller

Я создаю RESTful API и имею контроллер Spring REST (@RestController) и конфигурацию на основе аннотаций. Я хотел бы, чтобы приветственный файл моего проекта был файлом .html или .jsp с документацией по API.

В других веб-проектах я бы поместил список приветственных файлов в свой web.xml, но в этом конкретном проекте я не могу заставить его работать (предпочтительно с использованием Java и аннотаций).

Это мой WebApplicationInitializer

public class WebAppInitializer implements WebApplicationInitializer {

    public void onStartup(ServletContext servletContext) throws ServletException {
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
        context.register(ApplicationConfig.class);
        context.setServletContext(servletContext);

        ServletRegistration.Dynamic dynamic = servletContext.addServlet("dispatcher", 
           new DispatcherServlet(context));
        dynamic.addMapping("/");
        dynamic.setLoadOnStartup(1);
    }
}

Это мой WebMvcConfigurerAdapter

@Configuration
@ComponentScan("controller")
@EnableWebMvc
public class ApplicationConfig extends WebMvcConfigurerAdapter {

    @Bean
    public Application application() {
        return new Application("Memory");
    }

}

И это небольшая часть моего REST Controller

@RestController
@RequestMapping("/categories")
public class CategoryRestController {

    @Autowired
    Application application;

    @RequestMapping(method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
    public ResponseEntity<Map<Integer, Category>> getCategories(){
        if(application.getCategories().isEmpty()) {
            return new ResponseEntity<Map<Integer, Category>>(HttpStatus.NO_CONTENT);
        }
        return new ResponseEntity<Map<Integer, Category>>(application.getCategories(), HttpStatus.OK);
    }

}

До сих пор я пробовал:

  • Добавление только web.xml с <welcome-file-list> с <welcome-file>. (тут не повезло)
  • Перемещение @RequestMapping("/categories") в контроллере с уровня класса на все методы и добавление нового метода с @RequestMapping("/"), который возвращает либо String, либо ModelAndView с именем представления. (первый просто вернул пустую страницу со строкой, для последнего не удалось найти сопоставление)
  • Как предложено здесь: комбинация обоих, где мой web.xml <welcome-file> является "/index", в сочетании с @RequestMapping(value="/index"), возвращающим new ModelAndView("index"), и ViewResolver в моем классе конфигурации. (возвращает Warning: No mapping found in DispatcherServlet with name 'dispatcher', хотя «/index» успешно сопоставлен. Добавление «/index» вручную к URL-адресу успешно разрешает его в index.jsp)

person Joris    schedule 01.05.2016    source источник
comment
Для контроллера индекса используйте не @RestController, а @Controller. В противном случае вы получите поведение, описанное вами только что вернуло пустую страницу со строкой...   -  person M. Deinum    schedule 01.05.2016
comment
stackoverflow .com/questions/24670327/   -  person OhadR    schedule 03.01.2019


Ответы (1)


При указании контроллера для обработки вашей индексной страницы вы должны использовать @Controller, а не @RestController. Хотя @RestController является @Controller, он не преобразуется в представление, а возвращает результат клиенту как есть. При использовании @Controller при возврате String он будет разрешаться в имя представления.

@Controller
public class IndexController {

    @RequestMapping("/")
    public String index() {
        return "index";
    }
}

Однако есть более простой способ настроить это, и для этого вам не нужен контроллер. Настройте контроллер представления. В вашем классе конфигурации просто переопределите/реализуйте метод addViewControllers.

public void addViewControllers(ViewControllerRegistry registry) {
    registry.addViewController("/").setViewName("index");
}

Таким образом, вам даже не нужно создавать для него класс.

person M. Deinum    schedule 01.05.2016
comment
Как с помощью этой конфигурации я могу получить доступ к моей таблице стилей вне WEB-INF из моего JSP внутри WEB-INF? Я пробовал ../css/stylesheet.css, а также ${pageContext.request.contextPath}/css/stylesheet.css, как с тегом c:url, так и без него, но безрезультатно. - person Joris; 01.05.2016
comment
Извините, я только что нашел ответ здесь: stackoverflow .com/questions/14861720/ - person Joris; 01.05.2016