springboot 在get请求传json字符串出现出现报错

在SpringBoot 2.2.11版本中,使用GET请求传递JSON字符串时遇到错误。错误源于SpringBoot的更新。为解决问题,需在项目启动类中添加特定代码修复。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在springboot2.2.11启动项目在写请求获取信息接口入参是json格式的报错了,
结果发现是新的springboot做了调整导致这个报错

接口

@GetMapping("/getComponentListByComponentLibraryId")
    public ApiResult getComponentListByComponentLibraryId(@RequestParam("searchObject") String searchObject) {
        ComponentVo auditTaskRequest = JSON.parseObject(searchObject, ComponentVo.class);
        List<Component> companyTreeResponseDtoList =componentService.findComponentListByComponentLibraryId(auditTaskRequest);
        return success(new PageInfo<>(companyTreeResponseDtoList));
    }

报错如下:

java.lang.IllegalArgumentException: Invalid character found in the request target [/web/component/getComponentListByComponentLibraryId?searchObject={%22pageSize%22:10,%22pageNum%22:10,%22componentLibraryId%22:1,%22componentName%22:%22%22}]. The valid characters are defined in RFC 7230 and RFC 3986
	at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:490) ~[tomcat-embed-core-9.0.39.jar:9.0.39]
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:261) ~[tomcat-embed-core-9.0.39.jar:9.0.39]
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-embed-core-9.0.39.jar:9.0.39]
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:868) [tomcat-embed-core-9.0.39.jar:9.0.39]
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1590) [tomcat-embed-core-9.0.39.jar:9.0.39]
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.39.jar:9.0.39]
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_241]
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_241]
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.39.jar:9.0.39]
	at java.lang.Thread.run(Thread.java:748) [na:1.8.0_241]

解决方案:
在项目的启动类里面加上如下代码解决:

    @Bean
    public ConfigurableServletWebServerFactory webServerFactory() {
        TomcatServletWebServerFactory factory = new TomcatServletWebServerFactory();
        factory.addConnectorCustomizers((TomcatConnectorCustomizer) connector -> connector.setProperty("relaxedQueryChars", "|{}[]"));
        return factory;
    }
### 回答1: 在Spring Boot中使用@RequestBody注解可以接收json字符串作为参数。例如: ``` @RestController public class ExampleController { @GetMapping("/example") public String example(@RequestBody String json) { // 处理json字符串 return "处理完成"; } } ``` 这样,在发送GET请求json字符串,就可以在方法中使用json变量获取该字符串了。 或者,可以将json字符串映射到Java对象,例如: ``` @RestController public class ExampleController { @GetMapping("/example") public String example(@RequestBody MyModel model) { // 处理model对象 return "处理完成"; } } ``` 在这种情况下, json字符串将被映射到MyModel类型的对象。 ### 回答2: 在Spring Boot中使用Get请求接收JSON字符串的方式有多种方法。 一种常用的方式是使用@RequestParam注解,将需要接收的参数以键值对的形式递到方法中。首先需要定义一个请求处理方法,并在参数上添加@RequestParam注解,指定要接收的参数名。示例如下: @RequestMapping(value = "/example", method = RequestMethod.GET) public String exampleMethod(@RequestParam("jsonStr") String jsonStr) { // 对接收到的JSON字符串进行处理 // 返回响应结果 } 另一种方式是使用@PathVariable注解,将参数直接作为路径的一部分进行递。示例如下: @RequestMapping(value = "/example/{jsonStr}", method = RequestMethod.GET) public String exampleMethod(@PathVariable("jsonStr") String jsonStr) { // 对接收到的JSON字符串进行处理 // 返回响应结果 } 这样,当发送Get请求时,例如:/example/{jsonStr}?jsonStr={"key":"value"},Spring Boot会自动将路径中的jsonStr参数的值解析为一个字符串递给方法。 除了以上两种方式,还可以使用@RequestBody注解将JSON字符串直接映射为一个对象,示例如下: @RequestMapping(value = "/example", method = RequestMethod.GET) public String exampleMethod(@RequestBody ExampleModel exampleModel) { // 对接收到的JSON字符串进行处理 // 返回响应结果 } 需要注意的是,在这种情况下,需要在请求头中指定Content-Type为application/json。这样Spring Boot才能正确地将请求体中的JSON字符串解析成对应的对象。 总的来说,以上是几种在Spring Boot中使用Get请求接收JSON字符串的常用方法。根据具体情况选择合适的方式进行处理。 ### 回答3: 在Spring Boot中,我们可以使用GET请求接收JSON字符串,具体操作如下: 首先需要在Controller中创建一个接收GET请求的方法,并使用`@RequestMapping`注解指定请求路径和请求方法类型为GET。 ```java @Controller @RequestMapping("/api") public class ApiController { @GetMapping("/json") @ResponseBody public String getJson(@RequestParam("jsonStr") String jsonStr) { // 处理接收到的JSON字符串 // 返回处理结果 return "处理结果"; } } ``` 在上述代码中,`@GetMapping`注解指定了接口路径为`/api/json`,并且使用了`@RequestParam`注解来接收GET请求中名为`jsonStr`的参数,参数类型为String。 在方法体中,我们可以对接收到的JSON字符串进行处理,并根据业务需求返回处理结果。 最后,需要加上`@ResponseBody`注解来将返回值直接作为响应内容返回给客户端。 在发送GET请求时,也需要将参数拼接到URL中,例如:`http://localhost:8080/api/json?jsonStr={"name":"Tom","age":18}`。 这样,当客户端发送GET请求时,会将JSON字符串作为参数递给Controller的`getJson()`方法,然后方法会对JSON字符串进行处理,并返回处理结果给客户端。 总结起来,Spring Boot可以使用GET请求接收JSON字符串,需要在Controller中创建对应的接口方法,并使用`@RequestParam`注解来接收GET请求中的参数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值