如何解决将WebServerFactoryCustomizer的用法替换为TomcatWebServerFactoryCustomizer
tl:dr;我希望能够在URL参数http://localhost:8080/controller/square?parameter=PL¶meter[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¶meter[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;
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。