最近一直使用springcloud做開發,springcloud是基於springboot框架的一個微服務框架。springboot是對傳統的spring開發的進一步封裝的架構,對於以往很多的配置類的東西我們之需要簡單的添加注解就ok了,大大減少了重復代碼的構建,提升了開發效率。Springcloud對於那些業務模塊化的需求非常友好。各模塊既可以相互獨立,也可以相互依賴。一切通過配置實現。總之就是用了就覺得好。
任何技術都有不完善的地方,springcloud也不例外,這里我就說一下我在開發中遇到的一個問題。其實這算是對於版本更迭變化不了解帶來的問題。
之前開發時使用的都是1.5.x版本的,最近有一次在測試一個東西的時候使用了2.x版本的。版本變換,問題來了。
這里是我自己寫的一個簡單測試接口:
@RestController @RequestMapping("/test") public class Controller { @RequestMapping("/StrTest") @ApiImplicitParams({ @ApiImplicitParam(paramType = "query", name = "cfg", dataType = "String", required = true, value = "參數校驗") }) public String getString(String cfg){ System.out.println(cfg); return "success"; } }
maven依賴:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.12.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
<springfox-version>2.7.0</springfox-version>
<swagger-annotations-version>1.5.13</swagger-annotations-version>
<spring-cloud.version>Edgware.SR3</spring-cloud.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web-services</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>${springfox-version}</version>
<!--<scope>provided</scope>-->
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>${springfox-version}</version>
<!--<scope>provided</scope>-->
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
測試參數:
高版本運行:
Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986,請求中使用了無效的字符,看看參數,就是一個json串啊,使用其他的項目工程測試了一下,沒問題。
低版本運行:
在此仔細一看,原來我在構建工程的時候默認使用的是高版本的springboot,懷疑是版本問題,上網一搜,果然如此:
在springboot 2.x版本中,使用的tomcat版本是8.5版本,tomcat8.5對請求url做了限制,查看RFC規范知,url中只允許包含英文字母(a-zA-Z)、數字(0-9)、-_.~四個特殊字符以及保留字符( ! * ’ ( ) ; : @ & = + $ , / ? # [ ] ) (26*2+10+4+18=84)這84個字符.而我們的請求中出現了{}大括號,所以tomcat報錯.
以后構建相關項目工程的時候版本選擇一定要謹慎,不然坑的就是自己了。