View Javadoc
1   package cn.home1.oss.lib.webmvc.starter;
2   
3   import static org.apache.commons.lang3.StringUtils.isNotBlank;
4   
5   import cn.home1.oss.boot.autoconfigure.AppProperties;
6   import cn.home1.oss.lib.webmvc.api.DomainResolver;
7   import cn.home1.oss.lib.webmvc.api.RequestResolver;
8   import cn.home1.oss.lib.webmvc.internal.DefaultDomainResolver;
9   import cn.home1.oss.lib.webmvc.internal.DefaultHttpEntityMethodProcessor;
10  import cn.home1.oss.lib.webmvc.internal.DefaultRequestResolver;
11  
12  import org.springframework.beans.factory.annotation.Autowired;
13  import org.springframework.boot.autoconfigure.AutoConfigureBefore;
14  import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
15  import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
16  import org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration;
17  import org.springframework.boot.autoconfigure.web.ServerProperties;
18  import org.springframework.boot.autoconfigure.web.ServerProperties.Session;
19  import org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration;
20  import org.springframework.boot.context.properties.EnableConfigurationProperties;
21  import org.springframework.context.annotation.Bean;
22  import org.springframework.context.annotation.ComponentScan;
23  import org.springframework.context.annotation.Configuration;
24  import org.springframework.context.annotation.Import;
25  import org.springframework.core.env.Environment;
26  import org.springframework.web.servlet.DispatcherServlet;
27  import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;
28  
29  import javax.servlet.Servlet;
30  
31  /**
32   * Extends WebMvcConfigurerAdapter make this visable to MockMvc tests,
33   * does not override it's method.
34   */
35  @ConditionalOnClass({Servlet.class, DispatcherServlet.class})
36  @ConditionalOnWebApplication
37  @AutoConfigureBefore({ErrorMvcAutoConfiguration.class, WebMvcAutoConfiguration.class})
38  @Configuration
39  @ComponentScan(basePackages = {"cn.home1.oss.lib.webmvc.starter"})
40  @EnableConfigurationProperties(value = {AppProperties.class})
41  @Import({GsonConfiguration.class, Jackson2Configuration.class})
42  public class WebApplicationAutoConfiguration extends WebMvcConfigurerAdapter {
43  
44    @Autowired
45    private ServerProperties serverProperties;
46  
47    @Autowired
48    private AppProperties appProperties;
49  
50    @Autowired(required = false)
51    private Environment environment;
52  
53    @Autowired(required = false)
54    private com.fasterxml.jackson.databind.ObjectMapper objectMapper;
55  
56    @Bean
57    public DomainResolver domainResolver() {
58      final Session.Cookie sessionCookie = this.serverProperties.getSession().getCookie();
59      return new DefaultDomainResolver( //
60        sessionCookie.getDomain(), //
61        this.appProperties.getProdEnvironment() //
62      );
63    }
64  
65    // ------------------------------ default content negotiation ------------------------------
66  
67    @Bean
68    public RequestResolver requestResolver() {
69      return new DefaultRequestResolver(this.appProperties.getSecurity().getLoginEndpoint());
70    }
71  
72    @Bean //TODO gson
73    public DefaultHttpEntityMethodProcessor defaultHttpEntityMethodProcessor() {
74      return DefaultHttpEntityMethodProcessor.defaultHttpEntityMethodProcessor(this.environment, this.objectMapper);
75    }
76  
77    /**
78     * Usage: domain = envDomain(this.env, domain, "");
79     *
80     * @param env                 env
81     * @param rootDomain          domain.com
82     * @param productionSubDomain productionSubDomain
83     * @return domain
84     */
85    @Deprecated
86    static String envDomain( //
87      final String env, //
88      final String rootDomain, //
89      final String productionSubDomain //
90    ) {
91      final String domain;
92      if (AppProperties.getProdEnvironment(env)) {
93        domain = isNotBlank(productionSubDomain) ? //
94          productionSubDomain + "." + rootDomain : //
95          rootDomain;
96      } else {
97        domain = env + "." + rootDomain;
98      }
99      return domain;
100   }
101 }