Интеграция PCF для привода с пользовательским контекстным путем - PullRequest
0 голосов
/ 20 ноября 2018

Действительно борется здесь.Мы работаем с некоторыми сервисами 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".

Без компонента он работает так же, как и раньше.

...