| 知乎專欄 | 多維度架構 | | | 微信號 netkiller-ebook | | | QQ群:128659835 請註明“讀者” |
解決方法,加入下面代碼到 dispatcher-servlet.xml 檔案中
<mvc:annotation-driven />
dispatcher-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:context="http://www.springframework.org/schema/context"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:component-scan base-package="cn.netkiller.controller" />
<mvc:annotation-driven />
<bean id="viewResolver"
class="org.springframework.web.servlet.view.UrlBasedViewResolver">
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView" />
<property name="prefix" value="/WEB-INF/jsp/" />
<property name="suffix" value=".jsp" />
</bean>
</beans>
pom.xml 檔案中加入依賴包
<dependency> <groupId>javax.servlet</groupId> <artifactId>jstl</artifactId> <version>1.2</version> </dependency>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="viewClass" value="org.springframework.web.servlet.view.JstlView" /> <property name="prefix" value="/WEB-INF/jsp/" /> <!-- <property name="suffix" value=".jsp" /> --> <property name="viewNames" value="*.jsp" /> </bean> <bean id="templateResolver" class="org.thymeleaf.templateresolver.ServletContextTemplateResolver"> <property name="prefix" value="/WEB-INF/templates/" /> <!-- <property name="suffix" value=".html" /> --> <property name="templateMode" value="HTML5" /> </bean> <bean id="templateEngine" class="org.thymeleaf.spring4.SpringTemplateEngine"> <property name="templateResolver" ref="templateResolver" /> </bean> <bean class="org.thymeleaf.spring4.view.ThymeleafViewResolver"> <property name="templateEngine" ref="templateEngine" /> <property name="viewNames" value="*.html" /> </bean>
@RequestMapping("/thymeleaf")
public String thymeleafView(){
return "thymeleaf.html";
}
@RequestMapping("/jsp")
public String jspView(){
return "jstl.jsp";
}
<property name="viewNames" value="*thymeleaf/*" />
@RequestMapping(value="/test")
public ModelAndView dboxPrint(Model model){
ModelAndView modelAndView = new ModelAndView("thymeleaf/test");
return modelAndView;
}
方法一,排除靜態內容如 images, css, js 等等
<servlet>
<servlet-name>springframework</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>default</servlet-name>
<url-pattern>/images/*</url-pattern>
<url-pattern>*.css</url-pattern>
<url-pattern>/js/*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>springframework</servlet-name>
<url-pattern>/welcome.jsp</url-pattern>
<url-pattern>/welcome.html</url-pattern>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
方法二
<mvc:resources location="/images/" mapping="/images/**" /> <mvc:resources location="/css/" mapping="/css/**" /> <mvc:resources location="/js/" mapping="/js/**" />
配置 url-pattern 增加需要傳遞給Spring的副檔名
<servlet>
<servlet-name>springframework</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springframework</servlet-name>
<url-pattern>/welcome.jsp</url-pattern>
<url-pattern>/welcome.html</url-pattern>
<url-pattern>*.json</url-pattern>
<url-pattern>*.xml</url-pattern>
<url-pattern>*.html</url-pattern>
</servlet-mapping>
背景描述:Springboot 入口檔案 Application.java 的包是 package api; 為了讓 domain,pojo 共用,於是將 domain 放到Maven module下命令為 common。啟動後出現這個故障。
解決方案增加 @EntityScan("common.domain") 即可。
package api;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.cloud.netflix.eureka.EnableEurekaClient;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication
@EnableScheduling
@EnableEurekaClient
@EntityScan("common.domain")
public class Application {
public static void main(String[] args) {
System.out.println( "Service Api Starting..." );
SpringApplication.run(Application.class, args);
}
}
Oauth @RestController 一切正常, @Controller 提示如下
{"error":"unauthorized","error_description":"Full authentication is required to access this resource"}
程序如下
package api.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/")
public class IndexController {
public IndexController() {
// TODO Auto-generated constructor stub
}
@GetMapping("/")
public String index() {
return "Helloworld!!!";
}
@GetMapping("/about")
public String test() {
return "Helloworld!!!";
}
}
分析 @Controller 不允許直接返回字元串,必須使用 @ResponseBody 或者 ModelAndView,下改後問題解決。
package api.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
@Controller
@RequestMapping("/web")
public class IndexController {
public IndexController() {
// TODO Auto-generated constructor stub
}
@GetMapping("/")
@ResponseBody
public String index() {
return "Helloworld!!!";
}
@GetMapping("/about")
@ResponseBody
public String test() {
return "Helloworld!!!";
}
}
同時 @EnableWebSecurity 需要忽略 @Controller 的映射 URL
@Configuration
@EnableWebSecurity
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers("/**/json").antMatchers("/about", "/", "/css/**");
}
}