记一次springcloud一次版本变更的采坑

  最近一直使用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报错.

    以后构建相关项目工程的时候版本选择一定要谨慎,不然坑的就是自己了。

猜你喜欢

转载自www.cnblogs.com/lsbigdata/p/10852577.html