我正在尝试使用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);
}
}
重要的是要指出我没有为应用程序设置任何其他配置。在此先感谢您的帮助。
答案 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";
}