将WebServerFactoryCustomizer的用法替换为TomcatWebServerFactoryCustomizer

问题描述

tl:dr;我希望能够在URL参数http://localhost:8080/controller/square?parameter=PL&parameter[wow]=wow中使用方括号,并且以下三个Java文件可以正确地做到这一点。我的问题是如何使用https://docs.spring.io/spring-boot/docs/current/api/org/springframework/boot/autoconfigure/web/embedded/TomcatWebServerFactoryCustomizer.html重写代码

以下三个Java文件运行正常,它们使我在URL中具有[]字符。但是我想重写代码以使用TomcatWebServerFactoryCustomizer,但是我不知道如何以及从何处获取其构造函数的值:TomcatWebServerFactoryCustomizer(Environment environment,ServerProperties serverProperties)

Controller.java,文件1 of 3


import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping(value = "controller",produces = MediaType.APPLICATION_JSON_VALUE)
public class Controller {

  @GetMapping("/square")
  public ResponseEntity<String> requiredFields(
    @RequestParam(name = "parameter") final String parameter) {

    return ResponseEntity.status(HttpStatus.OK).body("OK");
  }
}

CustomWebServerAllowingSquareWebBrackets.java,文件2之3


import org.springframework.boot.web.embedded.tomcat.TomcatServletWebServerFactory;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;

class CustomWebServerAllowingSquareBracketsInParameters implements
  WebServerFactoryCustomizer<TomcatServletWebServerFactory> {

  /**
   * {@inheritDoc}
   */
  @Override
  public void customize(TomcatServletWebServerFactory factory) {
    factory.addConnectorCustomizers(connector -> {
      connector.setProperty("relaxedQueryChars","[]");
    });
  }
}

DemoForParametersWithSquareBracketsApplication.java,文件3之3


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class DemoForParametersWithSquareBracketsApplication {

  /**
   * Bean for {@link WebServerFactoryCustomizer}.
   * @return static class with customised web server.
   */
  @Bean
  public CustomWebServerAllowingSquareBracketsInParameters containerCustomizer() {
    return new CustomWebServerAllowingSquareBracketsInParameters();
  }

  public static void main(String[] args) {
    SpringApplication.run(DemoForParametersWithSquareBracketsApplication.class,args);
  }

}

上面的这三个Java文件在运行后使您能够在GET请求http://localhost:8080/controller/square?parameter=PL&parameter[wow]=wow之后成功执行。

在下面,您可以使用 TomcatWebServerFactoryCustomizer 找到我的自定义Web服务器类的修改后的类(当前不起作用)。

修改的CustomWebServerAllowingSquareBracketsInParameters.java,文件2之3

package com.example.demo;

import org.springframework.boot.autoconfigure.web.ServerProperties;
import org.springframework.boot.autoconfigure.web.embedded.TomcatWebServerFactoryCustomizer;
import org.springframework.boot.web.embedded.tomcat.ConfigurabletomcatWebServerFactory;
import org.springframework.core.env.Environment;

class CustomWebServerAllowingSquareBracketsInParameters extends TomcatWebServerFactoryCustomizer {

  public CustomWebServerAllowingSquareBracketsInParameters(Environment environment,ServerProperties serverProperties) {
    super(environment,serverProperties);
  }

  /**
   * {@inheritDoc}
   */
  @Override
  public void customize(ConfigurabletomcatWebServerFactory factory) {
    factory.addConnectorCustomizers(connector -> {
      connector.setProperty("relaxedQueryChars","[]");
    });

    super.customize(factory);
  }
}

修改后的DemoForParametersWithSquareBracketsApplication.java,文件3之3


import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.server.WebServerFactoryCustomizer;
import org.springframework.context.annotation.Bean;

@SpringBootApplication
public class DemoForParametersWithSquareBracketsApplication {

  /**
   * Bean for {@link WebServerFactoryCustomizer}.
   * @return static class with customised web server.
   */
  @Bean
  public CustomWebServerAllowingSquareBracketsInParameters containerCustomizer() {
    // Todo it will NOT compile
    return new CustomWebServerAllowingSquareBracketsInParameters(null,null);
  }

  public static void main(String[] args) {
    SpringApplication.run(DemoForParametersWithSquareBracketsApplication.class,args);
  }

}

我的问题是,从哪里以及如何获得构造函数的值Environment environment,ServerProperties serverProperties

解决方法

通过@Autowired标签访问环境。

    @Autowired
    protected Environment env;