Десериализация + (плюс) в параметре Spring Request - PullRequest
0 голосов
/ 18 ноября 2018

У меня есть простой запрос HTTP GET, подобный следующему:

http://localhost:8080/search?page=0&size=20&sort=id,asc&description=1+3

И RestController:

@RequestMapping(value = "/search", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<List<TestEntity>> search(Pageable pageable, @RequestParam("description") String description) {

    Page<TestEntity> page = service.search(pageable, description);
    HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(page);
    return ResponseEntity
            .ok()
            .headers(headers)
            .body(page.getContent());

}

Но значение @RequestParam "description"получает" 1 3 ".

Что я делаю не так?

Или что мне делать, чтобы сигналы типа" + "десериализовались в" + "в пружине @RequestParam?

Это мой pom.xml

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.0.5.RELEASE</version>
</parent>

<properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <maven.build.timestamp.format>yyyyMMddHHmmss</maven.build.timestamp.format>
    <project.http.version>1.23.0</project.http.version>
    <project.oauth.version>1.23.0</project.oauth.version>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-tomcat</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
    <dependency>
        <groupId>com.zaxxer</groupId>
        <artifactId>HikariCP</artifactId>
        <version>3.1.0</version>
    </dependency>
    <dependency>
        <groupId>org.liquibase</groupId>
        <artifactId>liquibase-core</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId>
    </dependency>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-mail</artifactId>
    </dependency>

    <dependency>
        <groupId>javax.xml.bind</groupId>
        <artifactId>jaxb-api</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-core</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>com.sun.xml.bind</groupId>
        <artifactId>jaxb-impl</artifactId>
        <version>2.3.0</version>
    </dependency>
    <dependency>
        <groupId>org.apache.commons</groupId>
        <artifactId>commons-lang3</artifactId>
        <version>3.8.1</version>
    </dependency>

</dependencies>

<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>

Ответы [ 2 ]

0 голосов
/ 18 ноября 2018

Все как и ожидалось.Согласно RFC3986 в кодировке URL + является зарезервированным символом, декодированным в пробел.Чтобы использовать + в качестве значения, вам необходимо закодировать его как %2B, как описано в Зарезервированные в процентах символы .Это сделает ваш URL:

http://localhost:8080/search?page=0&size=20&sort=id,asc&description=1%2B3

Обратите внимание, что иногда Spring не согласован, когда дело касается обработки +, например, SPR-16860 Spring несовместим в кодировке /декодирование URL ошибка.

0 голосов
/ 18 ноября 2018

Вам не хватает Кодировка URL , которая не связана с десериализацией,

+ кодируется как% 2B

Когда выотправив HTTP-запрос, вы должны закодировать значения ваших параметров, в вашем случае + следует заменить на %2B:

http://localhost:8080/search?page=0&size=20&sort=id,asc&description=1%2B3

для углового использования HttpUrlEncodingCodec encodeValue(value: string)

...