Spring Boot with Two MVC Configurations

后端 未结 4 1813
名媛妹妹
名媛妹妹 2020-12-24 08:13

I have a Spring Boot app with a REST API, using Jackson for the JSON view configuration. It works great and I can get all the Spring Boot goodness.

However, I need t

4条回答
  •  自闭症患者
    2020-12-24 08:39

    If you can live with a different port for each context, then you only have to overwrite the DispatcherServletAutoConfiguration beans. All the rest of the magic works, multpart, Jackson etc. You can configure the Servlet and Jackson/Multipart etc. for each child-context separately and inject bean of the parent context.

    package test;
    
    import static org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_BEAN_NAME;
    import static org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration.DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME;
    
    import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
    import org.springframework.boot.builder.SpringApplicationBuilder;
    import org.springframework.boot.context.embedded.ServletRegistrationBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.context.annotation.PropertySource;
    import org.springframework.http.converter.json.Jackson2ObjectMapperBuilder;
    import org.springframework.web.servlet.DispatcherServlet;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
    
    @Configuration
    @EnableAutoConfiguration(exclude = {
            Application.Context1.class,
            Application.Context2.class
    })
    public class Application extends WebMvcConfigurerAdapter {
    
        @Bean
        public TestBean testBean() {
            return new TestBean();
        }
    
        public static void main(String[] args) {
            final SpringApplicationBuilder builder = new SpringApplicationBuilder().parent(Application.class);
            builder.child(Context1.class).run();
            builder.child(Context2.class).run();
        }
    
        public static class TestBean {
        }
    
        @Configuration
        @EnableAutoConfiguration(exclude = {Application.class, Context2.class})
        @PropertySource("classpath:context1.properties")
        public static class Context1 {
    
            @Bean(name = DEFAULT_DISPATCHER_SERVLET_BEAN_NAME)
            DispatcherServlet dispatcherServlet() {
                DispatcherServlet dispatcherServlet = new DispatcherServlet();
                // custom config here
                return dispatcherServlet;
            }
    
            @Bean(name = DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME)
            ServletRegistrationBean dispatcherServletRegistration() {
                ServletRegistrationBean registration = new ServletRegistrationBean(dispatcherServlet(), "/test1");
                registration.setName(DEFAULT_DISPATCHER_SERVLET_BEAN_NAME);
                // custom config here
                return registration;
            }
    
            @Bean
            Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder(TestBean testBean) {
                System.out.println(testBean);
                Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
                // custom config here
                return builder;
            }
        }
    
        @Configuration
        @EnableAutoConfiguration(exclude = {Application.class, Context1.class})
        @PropertySource("classpath:context2.properties")
        public static class Context2 {
    
            @Bean(name = DEFAULT_DISPATCHER_SERVLET_BEAN_NAME)
            DispatcherServlet dispatcherServlet() {
                DispatcherServlet dispatcherServlet = new DispatcherServlet();
                // custom config here
                return dispatcherServlet;
            }
    
            @Bean(name = DEFAULT_DISPATCHER_SERVLET_REGISTRATION_BEAN_NAME)
            ServletRegistrationBean dispatcherServletRegistration() {
                ServletRegistrationBean registration = new ServletRegistrationBean(dispatcherServlet(), "/test2");
                registration.setName(DEFAULT_DISPATCHER_SERVLET_BEAN_NAME);
                // custom config here
                return registration;
            }
    
            @Bean
            Jackson2ObjectMapperBuilder jackson2ObjectMapperBuilder(TestBean testBean) {
                System.out.println(testBean);
                Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
                // custom config here
                return builder;
            }
        }
    }
    

    The context1/2.properties files currently only contain a server.port=8080/8081 but you can set all the other spring properties for the child contexts there.

提交回复
热议问题