如何在springboot控制器中映射所有对* .html的调用?

时间:2016-01-25 18:16:34

标签: java json spring-mvc thymeleaf

我正在尝试使用Thymeleaf模板和springboot api提供动态html页面。这是我想要实现的方案。

如果有人发出以下请求:主机名/客户端,那么如果有人提出此请求,应用程序将返回Json对象: hostname / client.html ,此请求在不同的控制器中捕获,以便我可以操作将返回的视图。

客户端控制器  这个类按预期工作,它返回一个Json对象

@RestController
public class ClientController {

    @Autowired
    public ClientService clientServiceImp;

   @RequestMapping("/client")
    public Client get(@RequestParam(value="name", defaultValue="World") String name){
        return clientServiceImp.getClient(name);
    }
}

家庭控制器  此类的方法不会将调用映射到* .html

@Controller
public class HomeController {
    @RequestMapping(value={"/*.html"},  produces="text/html")   
    public String getIndex(Model model, HttpServletRequest request){

     // I will set here the thymeleaf fragment location based on the resource requested.
        return "index";
    }

*这是我在调用hostname / client.html后收到的错误 白标错误页面 *此应用程序没有/ error的显式映射,因此您将此视为后备。 1月25日星期一16:04:56 BRST 2016 出现意外错误(type = Not Acceptable,status = 406)。 无法找到可接受的代表**

Springboot基本配置

@SpringBootApplication(scanBasePackages = {"com.serviceira"})
public class App {
        public static void main(String[] args) {
            SpringApplication.run(App.class, args);
        }
}

重要的是要指出我没有为应用程序设置任何其他配置。在此先感谢您的帮助。

2 个答案:

答案 0 :(得分:0)

ClientController正常工作的原因是因为您将其标记为@RestController,您告诉Spring直接将响应写入html页面。

但是,您的HomeController找不到映射,因为您还没有设置servlet映射。

如果您使用的是Java配置:

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRegistration;

import org.springframework.web.WebApplicationInitializer;
import org.springframework.web.context.ContextLoaderListener;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;
import org.springframework.web.servlet.DispatcherServlet;

public class WebAppInitializer implements WebApplicationInitializer {

    @Override
    public void onStartup(ServletContext servletContext) throws ServletException {
        WebApplicationContext context = getContext();
        servletContext.addListener(new ContextLoaderListener(context));
        ServletRegistration.Dynamic dispatcher = servletContext.addServlet("DispatcherServlet", new DispatcherServlet(context));
        dispatcher.setLoadOnStartup(1);
        dispatcher.addMapping("*.html");  // HERE YOU ARE SETTING THE .html mapping
    }

    private AnnotationConfigWebApplicationContext getContext() {
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
        context.setConfigLocation("your package name here");
        return context;
    }

}

如果您使用的是XML,那么除了设置您的服务器外,还需要这样的映射:

 <servlet>
    <servlet-name>myServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/config/servlet-config.xml</param-value>
    </init-param>
  </servlet>

  <servlet-mapping>
    <servlet-name>myServlet</servlet-name>
    <url-pattern>*.html</url-pattern>
  </servlet-mapping>

答案 1 :(得分:0)

解决了问题

我通过为每个控制器的RequestMapping注释添加不同的“produce”参数解决了这个问题,除了将getIndex的值从/.html更改为 .html。

HomeController

 @RequestMapping(value={"*.html"},  produces="text/html")   

<强> ClientController

 @RequestMapping(value="/client" produces="application/json")

现在,包含* .html的每个请求都由HomeController类的getIndex方法接收和处理,其他请求由其自己的控制器处理。例如:

请求: GET:localhost / client
控制器

 @RequestMapping(value="/client" produces="application/json")
        public Client get(@RequestParam(value="name", defaultValue="World") String name){
            return clientServiceImp.getClient(name);
        }

请求:GET:localhost / client.html
控制器

  @RequestMapping(value={"*.html"},  produces="text/html")   
        public String getIndex(Model model, HttpServletRequest request){

         // I will set here the thymeleaf fragment location based on the resource requested.
            return "index";
        }