如何在 Spring Get API 中接受对象数组作为请求参数

How to accept an array of object as request param in Spring Get API

我正在使用第 3 方网格,当输入字符时生成以下 GET API:

http://localhost:4200/api/v1/driver/getDriverListForDropDown?firstName=[{%22field%22:%22DriverCode%22,%22operator%22:%22startsWith%22,%22value%22:%2212345%22,%22caseSensitive%22:false}]

生成的请求参数:

firstName:[{"field":"DriverCode","operator":"startsWith","value":"*","caseSensitive":false}]

我正在尝试在 spring 启动时创建休息 API,但无法点击 API。

我尝试了以下方法:

    @GetMapping(path = "/getDriverListForDropDown")
    public ResponseEntity<RestApiResponse<List<DriverDataForDropDown>>> getDriverListForDropDown(
        @ApiIgnore Context context, @RequestParam(value="firstName") List<DriverDropdownFilterRequest> firstName)

DriverDropdownFilterRequest :

@Data
@NoArgsConstructor
@AllArgsConstructor
@JsonNaming(PropertyNamingStrategy.UpperCamelCaseStrategy.class)
@JsonIgnoreProperties(ignoreUnknown = true)
@Builder(toBuilder = true)
public class DriverDropdownFilterRequest
{
  String field;
  String operator;
  String value;
}

但我总是收到 400 错误,并且在后端出现以下错误:

java.lang.IllegalArgumentException: Invalid character found in the request target. The valid characters are defined in RFC 7230 and RFC 3986 at org.apache.coyote.http11.Http11InputBuffer.parseRequestLine(Http11InputBuffer.java:468) ~[tomcat-embed-core-9.0.29.jar:9.0.29] at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:260) ~[tomcat-embed-core-9.0.29.jar:9.0.29] at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65) [tomcat-embed-core-9.0.29.jar:9.0.29] at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:860) [tomcat-embed-core-9.0.29.jar:9.0.29] at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1591) [tomcat-embed-core-9.0.29.jar:9.0.29] at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) [tomcat-embed-core-9.0.29.jar:9.0.29] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) [na:1.8.0_171] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) [na:1.8.0_171] at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) [tomcat-embed-core-9.0.29.jar:9.0.29]

我尝试了几个选项,但没有任何效果。请帮忙。

我想,正如您的异常提示,请检查您的请求格式是否有效(可能 firstName 参数中的字符 '[' 和 ']' 矛盾),或者您的 tomcat 版本支持您的格式,请参考这个post.

建议:也许不给参数分配 hash-like 值,您可以通过创建新参数(不仅仅是名字)或通过设置能够接受主体的 API 点来分隔它们json。例如

@GetMapping(path = "/get")
public ResponseEntity<...> get(..., @RequestBody Map<...> firstname) 
{
    .
    .
    .
}

干杯!

问题是第 3 方没有正确编码参数,tomcat 拒绝了这些字符。

即使在 application.properties 中添加宽松的字符也没有用。

唯一可行的解​​决方案是添加以下配置:

@Component
public class TomcatWebServerCustomizer implements 
WebServerFactoryCustomizer<TomcatServletWebServerFactory>
  {
    /**
     * Customize the specified
    * @param factory the web server factory to customize
    */
    @Override
    public void customize(TomcatServletWebServerFactory factory)
     {
       factory.addConnectorCustomizers(connector -> 
      connector.setAttribute("relaxedQueryChars", "<>[\]^`{|}"));
     }
   }