最近一直使用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报错.
以后构建相关项目工程的时候版本选择一定要谨慎,不然坑的就是自己了。