Действительно борется здесь.Мы работаем с некоторыми сервисами Spring Boot (1.5.x) на PCF.теперь я пытаюсь заставить интеграцию PCF работать через привод.Это доставляет мне больше проблем, чем я ожидал.Проблема в том, что у многих наших сервисов есть пользовательский server.contextPath
(например, / api / vX).Благодаря такому дизайну у нас теперь также есть конечная точка / cloudfoundryapplication в этом contextPath (поэтому, к сожалению, PCF не может ее найти).
Я уже нашел проблему в репозитории Spring Boot.Вот ссылка на проблему, описывающая ее и предоставляющая исправление https://github.com/spring-projects/spring-boot/issues/9081.
@Bean
public TomcatEmbeddedServletContainerFactory servletContainerFactory() {
return new TomcatEmbeddedServletContainerFactory() {
protected void prepareContext(Host host, ServletContextInitializer[] initializers) {
super.prepareContext(host, initializers);
StandardContext child = new StandardContext();
child.addLifecycleListener(new FixContextListener());
child.setPath("/cloudfoundryapplication");
ServletContainerInitializer initializer = ActuatorConfig.this.getServletContextInitializer(this.getContextPath());
child.addServletContainerInitializer(initializer, Collections.emptySet());
child.setCrossContext(true);
host.addChild(child);
}
};
}
private ServletContainerInitializer getServletContextInitializer(String contextPath) {
return (c, context) -> {
Servlet servlet = new GenericServlet() {
public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException {
ServletContext context = req.getServletContext().getContext(contextPath);
context.getRequestDispatcher("/cloudfoundryapplication").forward(req, res);
}
};
context.addServlet("cloudfoundry", servlet).addMapping(new String[]{"/*"});
};
}
Я попробовал - и хорошо, это просто работает.Моя проблема сейчас в том, что когда я создаю этот Бин, мои RestControllers, обращающиеся к HttpServletResponse, ведут себя по-другому.Один из случаев, который был непосредственно обнаружен нашим интеграционным тестом, заключался в том, что мы больше не можем устанавливать, например, contentType через setter.например,
public ResponseEntity<byte[]> getSomeImage(HttpServletResponse response, ..){
... getData
response.setContentType("image/png");
return ResponseEntity.ok().body(bytes);
}
игнорируется: ошибка в IntegrationTest:
Expected content-type "image/png" doesn't match actual content-type "application/octet-stream;charset=UTF-8".
Без компонента он работает так же, как и раньше.