知乎專欄 | 多維度架構 | | | 微信號 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/**"); } }