template) {
59 | if (StringUtils.hasLength(properties.getPrefix())) {
60 | return new RedisFrequencyLimiter(properties.getPrefix(), template);
61 | }
62 | return new RedisFrequencyLimiter(template);
63 | }
64 | }
65 |
--------------------------------------------------------------------------------
/coffee-autoconfigures/coffee-autoconfigure-extra/src/main/java/site/zido/coffee/autoconfigure/extra/package-info.java:
--------------------------------------------------------------------------------
1 | package site.zido.coffee.autoconfigure.extra;
--------------------------------------------------------------------------------
/coffee-autoconfigures/coffee-autoconfigure-extra/src/main/resources/META-INF/spring-configuration-metadata.json:
--------------------------------------------------------------------------------
1 | {
2 | "groups": [
3 | {
4 | "name": "coffee.limiter",
5 | "type": "site.zido.coffee.common.limiter.LimiterProperties",
6 | "sourceType": "site.zido.coffee.common.limiter.LimiterAutoConfiguration",
7 | "sourceMethod": "createProperties()",
8 | "description": "限流器相关属性"
9 | }
10 | ],
11 | "properties": [
12 | {
13 | "name": "coffee.limiter.prefix",
14 | "type": "java.lang.String",
15 | "sourceType": "site.zido.coffee.common.limiter.LimiterProperties",
16 | "description": "设置limiter前缀"
17 | }
18 | ],
19 | "hints": []
20 | }
--------------------------------------------------------------------------------
/coffee-autoconfigures/coffee-autoconfigure-extra/src/main/resources/META-INF/spring.factories:
--------------------------------------------------------------------------------
1 | org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
2 | site.zido.coffee.autoconfigure.extra.limiter.LimiterRedisConfiguration,\
3 | site.zido.coffee.autoconfigure.extra.limiter.LimiterAutoConfiguration,\
4 | site.zido.coffee.autoconfigure.extra.limiter.LimiterExceptionAutoHandlerConfiguration
--------------------------------------------------------------------------------
/coffee-autoconfigures/coffee-autoconfigure-rest-security/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 | coffee-autoconfigures
7 | site.zido
8 | 0.3.0-SNAPSHOT
9 |
10 | 4.0.0
11 |
12 | coffee-autoconfigure-rest-security
13 |
14 |
15 | site.zido
16 | coffee-webmvc
17 |
18 |
19 | site.zido
20 | coffee-rest-security
21 |
22 |
23 | org.springframework.data
24 | spring-data-redis
25 | compile
26 | true
27 |
28 |
29 |
30 |
--------------------------------------------------------------------------------
/coffee-autoconfigures/coffee-autoconfigure-rest-security/src/main/java/site/zido/coffee/autoconfigure/security/rest/AuthorizationStorageJWTCondition.java:
--------------------------------------------------------------------------------
1 | package site.zido.coffee.autoconfigure.security.rest;
2 |
3 | import org.springframework.context.annotation.Condition;
4 | import org.springframework.context.annotation.ConditionContext;
5 | import org.springframework.core.type.AnnotatedTypeMetadata;
6 |
7 | public class AuthorizationStorageJWTCondition implements Condition {
8 |
9 | @Override
10 | public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
11 | String storeType = context.getEnvironment().getProperty("spring.security.secureStoreType", "JWT");
12 | return SecureStoreType.JWT.name().equalsIgnoreCase(storeType);
13 | }
14 | }
15 |
--------------------------------------------------------------------------------
/coffee-autoconfigures/coffee-autoconfigure-rest-security/src/main/java/site/zido/coffee/autoconfigure/security/rest/RestSecurityAutoConfiguration.java:
--------------------------------------------------------------------------------
1 | package site.zido.coffee.autoconfigure.security.rest;
2 |
3 | import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
4 | import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
5 | import org.springframework.boot.autoconfigure.security.SecurityDataConfiguration;
6 | import org.springframework.boot.autoconfigure.security.SecurityProperties;
7 | import org.springframework.boot.autoconfigure.security.servlet.SpringBootWebSecurityConfiguration;
8 | import org.springframework.boot.autoconfigure.security.servlet.WebSecurityEnablerConfiguration;
9 | import org.springframework.boot.context.properties.EnableConfigurationProperties;
10 | import org.springframework.context.ApplicationEventPublisher;
11 | import org.springframework.context.annotation.Bean;
12 | import org.springframework.context.annotation.Configuration;
13 | import org.springframework.context.annotation.Import;
14 | import org.springframework.security.authentication.AuthenticationEventPublisher;
15 | import org.springframework.security.authentication.DefaultAuthenticationEventPublisher;
16 |
17 | /**
18 | * rest security自动配置类
19 | *
20 | * SpringBootRestSecurityConfiguration代替原来的{@link SpringBootWebSecurityConfiguration}
21 | *
22 | * 去掉{@link WebSecurityEnablerConfiguration}以取消
23 | * {@link org.springframework.security.config.annotation.web.configuration.EnableWebSecurity}注解所带来的其他自动配置
24 | *
25 | * @author zido
26 | */
27 | @Configuration(proxyBeanMethods = false)
28 | @ConditionalOnClass(DefaultAuthenticationEventPublisher.class)
29 | @EnableConfigurationProperties(SecurityProperties.class)
30 | @Import({SpringBootRestSecurityConfiguration.class,
31 | WebSecurityEnablerConfiguration.class,
32 | SecurityDataConfiguration.class})
33 | public class RestSecurityAutoConfiguration {
34 |
35 | @Bean
36 | @ConditionalOnMissingBean(AuthenticationEventPublisher.class)
37 | public DefaultAuthenticationEventPublisher authenticationEventPublisher(ApplicationEventPublisher publisher) {
38 | return new DefaultAuthenticationEventPublisher(publisher);
39 | }
40 |
41 | }
42 |
--------------------------------------------------------------------------------
/coffee-autoconfigures/coffee-autoconfigure-rest-security/src/main/java/site/zido/coffee/autoconfigure/security/rest/RestSecurityFilterAutoConfiguration.java:
--------------------------------------------------------------------------------
1 | package site.zido.coffee.autoconfigure.security.rest;
2 |
3 | import org.springframework.boot.autoconfigure.AutoConfigureAfter;
4 | import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
5 | import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
6 | import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication;
7 | import org.springframework.boot.autoconfigure.condition.ConditionalOnWebApplication.Type;
8 | import org.springframework.boot.autoconfigure.security.SecurityProperties;
9 | import org.springframework.boot.context.properties.EnableConfigurationProperties;
10 | import org.springframework.boot.web.servlet.DelegatingFilterProxyRegistrationBean;
11 | import org.springframework.context.annotation.Bean;
12 | import org.springframework.context.annotation.Configuration;
13 | import org.springframework.security.web.context.AbstractSecurityWebApplicationInitializer;
14 |
15 | import javax.servlet.DispatcherType;
16 | import java.util.EnumSet;
17 | import java.util.stream.Collectors;
18 |
19 | /**
20 | * 单独提取filter配置,以确保自动配置顺序
21 | *
22 | * @author zido
23 | */
24 | @Configuration(proxyBeanMethods = false)
25 | @ConditionalOnWebApplication(type = Type.SERVLET)
26 | @EnableConfigurationProperties(SecurityProperties.class)
27 | @ConditionalOnClass({AbstractSecurityWebApplicationInitializer.class})
28 | @AutoConfigureAfter(RestSecurityAutoConfiguration.class)
29 | public class RestSecurityFilterAutoConfiguration {
30 |
31 | private static final String DEFAULT_FILTER_NAME = AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME;
32 |
33 | @Bean
34 | @ConditionalOnBean(name = DEFAULT_FILTER_NAME)
35 | public DelegatingFilterProxyRegistrationBean securityFilterChainRegistration(
36 | SecurityProperties securityProperties) {
37 | DelegatingFilterProxyRegistrationBean registration = new DelegatingFilterProxyRegistrationBean(
38 | DEFAULT_FILTER_NAME);
39 | registration.setOrder(securityProperties.getFilter().getOrder());
40 | registration.setDispatcherTypes(getDispatcherTypes(securityProperties));
41 | return registration;
42 | }
43 |
44 | private EnumSet getDispatcherTypes(SecurityProperties securityProperties) {
45 | if (securityProperties.getFilter().getDispatcherTypes() == null) {
46 | return null;
47 | }
48 | return securityProperties.getFilter().getDispatcherTypes().stream()
49 | .map((type) -> DispatcherType.valueOf(type.name()))
50 | .collect(Collectors.collectingAndThen(Collectors.toSet(), EnumSet::copyOf));
51 | }
52 |
53 | }
54 |
--------------------------------------------------------------------------------
/coffee-autoconfigures/coffee-autoconfigure-rest-security/src/main/java/site/zido/coffee/autoconfigure/security/rest/SecureStoreType.java:
--------------------------------------------------------------------------------
1 | package site.zido.coffee.autoconfigure.security.rest;
2 |
3 | public enum SecureStoreType {
4 | // spring security自带的cookie
5 | COOKIE,
6 | //JWT token 标准
7 | JWT,
8 | //TODO 传统token支持
9 | TOKEN
10 | }
11 |
--------------------------------------------------------------------------------
/coffee-autoconfigures/coffee-autoconfigure-rest-security/src/main/java/site/zido/coffee/autoconfigure/security/rest/WebSecurityAutoFilter.java:
--------------------------------------------------------------------------------
1 | package site.zido.coffee.autoconfigure.security.rest;
2 |
3 | import org.springframework.boot.autoconfigure.AutoConfigurationImportFilter;
4 | import org.springframework.boot.autoconfigure.AutoConfigurationMetadata;
5 | import org.springframework.context.EnvironmentAware;
6 | import org.springframework.core.env.Environment;
7 |
8 | import java.util.Arrays;
9 | import java.util.HashSet;
10 | import java.util.Set;
11 |
12 | public class WebSecurityAutoFilter implements AutoConfigurationImportFilter, EnvironmentAware {
13 | private static final Set WEB_SECURITY_SKIP = new HashSet<>(
14 | Arrays.asList("org.springframework.boot.autoconfigure.security.servlet.SecurityAutoConfiguration",
15 | "org.springframework.boot.autoconfigure.security.servlet.SecurityFilterAutoConfiguration")
16 | );
17 |
18 | private static final Set REST_SECURITY_SKIP = new HashSet<>(
19 | Arrays.asList("site.zido.coffee.autoconfigure.security.rest.RestSecurityFilterAutoConfiguration",
20 | "site.zido.coffee.autoconfigure.security.rest.RestSecurityAutoConfiguration")
21 | );
22 |
23 | private boolean useRest = true;
24 |
25 | @Override
26 | public boolean[] match(String[] classNames, AutoConfigurationMetadata metadata) {
27 | boolean[] matches = new boolean[classNames.length];
28 |
29 | for (int i = 0; i < classNames.length; i++) {
30 | matches[i] = !(useRest ? WEB_SECURITY_SKIP : REST_SECURITY_SKIP).contains(classNames[i]);
31 | }
32 | return matches;
33 | }
34 |
35 | @Override
36 | public void setEnvironment(Environment environment) {
37 | this.useRest = "JWT".equalsIgnoreCase(environment.getProperty("spring.security.secureStoreType", "JWT"));
38 | }
39 | }
40 |
--------------------------------------------------------------------------------
/coffee-autoconfigures/coffee-autoconfigure-rest-security/src/main/java/site/zido/coffee/autoconfigure/security/rest/authorize/PhoneCodeAutoConfiguration.java:
--------------------------------------------------------------------------------
1 | package site.zido.coffee.autoconfigure.security.rest.authorize;
2 |
3 | import org.springframework.boot.autoconfigure.AutoConfigureAfter;
4 | import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
5 | import org.springframework.boot.context.properties.EnableConfigurationProperties;
6 | import org.springframework.context.annotation.Bean;
7 | import org.springframework.context.annotation.Configuration;
8 | import org.springframework.util.StringUtils;
9 | import site.zido.coffee.autoconfigure.security.rest.CoffeeSecurityProperties;
10 | import site.zido.coffee.security.authentication.phone.MemoryPhoneCodeCache;
11 | import site.zido.coffee.security.authentication.phone.PhoneCodeCache;
12 |
13 | @Configuration
14 | @EnableConfigurationProperties({CoffeeSecurityProperties.class})
15 | @AutoConfigureAfter(RedisPhoneCodeConfiguration.class)
16 | public class PhoneCodeAutoConfiguration {
17 | @ConditionalOnMissingBean(PhoneCodeCache.class)
18 | @Bean
19 | public PhoneCodeCache getCache(CoffeeSecurityProperties properties) {
20 | return new MemoryPhoneCodeCache() {
21 | @Override
22 | public void put(String phone, String code) {
23 | super.put(phone, code);
24 | }
25 |
26 | @Override
27 | public String getCode(String phone) {
28 | if (StringUtils.hasText(properties.getPhoneCode().getKeyPrefix())) {
29 | phone = properties.getPhoneCode().getKeyPrefix() + phone;
30 | }
31 | return super.getCode(phone);
32 | }
33 |
34 | @Override
35 | public long getTimeout() {
36 | return properties.getPhoneCode().getTimeout() == null
37 | ? super.getTimeout()
38 | : properties.getPhoneCode().getTimeout();
39 | }
40 | };
41 | }
42 | }
43 |
--------------------------------------------------------------------------------
/coffee-autoconfigures/coffee-autoconfigure-rest-security/src/main/java/site/zido/coffee/autoconfigure/security/rest/authorize/RedisPhoneCodeConfiguration.java:
--------------------------------------------------------------------------------
1 | package site.zido.coffee.autoconfigure.security.rest.authorize;
2 |
3 | import org.springframework.beans.factory.annotation.Autowired;
4 | import org.springframework.beans.factory.annotation.Qualifier;
5 | import org.springframework.boot.autoconfigure.AutoConfigureAfter;
6 | import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
7 | import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
8 | import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration;
9 | import org.springframework.context.annotation.Bean;
10 | import org.springframework.context.annotation.Configuration;
11 | import org.springframework.data.redis.connection.RedisConnectionFactory;
12 | import org.springframework.data.redis.core.StringRedisTemplate;
13 | import site.zido.coffee.autoconfigure.security.rest.CoffeeSecurityProperties;
14 | import site.zido.coffee.security.authentication.phone.PhoneCodeCache;
15 | import site.zido.coffee.security.authentication.phone.SpringRedisPhoneCodeCache;
16 |
17 | import java.util.concurrent.TimeUnit;
18 |
19 | @Configuration
20 | @ConditionalOnBean(RedisConnectionFactory.class)
21 | @AutoConfigureAfter(RedisAutoConfiguration.class)
22 | public class RedisPhoneCodeConfiguration {
23 | public static final String TEMPLATE_BEAN_NAME = "phoneCodeCacheTemplate";
24 |
25 | @Bean
26 | @ConditionalOnMissingBean(PhoneCodeCache.class)
27 | public PhoneCodeCache phoneCodeCache(@Autowired CoffeeSecurityProperties properties,
28 | @Autowired @Qualifier(TEMPLATE_BEAN_NAME) StringRedisTemplate template) {
29 | SpringRedisPhoneCodeCache cache = new SpringRedisPhoneCodeCache();
30 | cache.setKeyPrefix(properties.getPhoneCode().getKeyPrefix());
31 | if (properties.getPhoneCode().getTimeout() != null) {
32 | cache.setTimeout(properties.getPhoneCode().getTimeout(), TimeUnit.SECONDS);
33 | }
34 | cache.setTemplate(template);
35 | return cache;
36 | }
37 |
38 | @Bean(value = TEMPLATE_BEAN_NAME)
39 | @ConditionalOnMissingBean(name = TEMPLATE_BEAN_NAME)
40 | public StringRedisTemplate createTemplate(RedisConnectionFactory factory) {
41 | return new StringRedisTemplate(factory);
42 | }
43 | }
44 |
--------------------------------------------------------------------------------
/coffee-autoconfigures/coffee-autoconfigure-rest-security/src/main/resources/META-INF/spring-configuration-metadata.json:
--------------------------------------------------------------------------------
1 | {
2 | "groups": [
3 | {
4 | "name": "spring.security",
5 | "type": "site.zido.coffee.autoconfigure.security.rest.CoffeeSecurityProperties",
6 | "sourceType": "site.zido.coffee.autoconfigure.security.rest.CoffeeSecurityProperties"
7 | },
8 | {
9 | "name": "spring.security.jwt",
10 | "type": "site.zido.coffee.autoconfigure.security.rest.CoffeeSecurityProperties$JwtProperties",
11 | "sourceType": "site.zido.coffee.autoconfigure.security.rest.CoffeeSecurityProperties",
12 | "sourceMethod": "getJwt()"
13 | },
14 | {
15 | "name": "spring.security.phone-code",
16 | "type": "site.zido.coffee.autoconfigure.security.rest.CoffeeSecurityProperties$AuthorizationPhoneCodeProperties",
17 | "sourceType": "site.zido.coffee.autoconfigure.security.rest.CoffeeSecurityProperties",
18 | "sourceMethod": "getPhoneCode()"
19 | }
20 | ],
21 | "properties": [
22 | {
23 | "name": "spring.security.jwt.auto-refresh",
24 | "type": "java.lang.Boolean",
25 | "sourceType": "site.zido.coffee.autoconfigure.security.rest.CoffeeSecurityProperties$JwtProperties",
26 | "defaultValue": true
27 | },
28 | {
29 | "name": "spring.security.jwt.expiration",
30 | "type": "java.lang.Long",
31 | "sourceType": "site.zido.coffee.autoconfigure.security.rest.CoffeeSecurityProperties$JwtProperties"
32 | },
33 | {
34 | "name": "spring.security.jwt.header",
35 | "type": "java.lang.String",
36 | "sourceType": "site.zido.coffee.autoconfigure.security.rest.CoffeeSecurityProperties$JwtProperties",
37 | "defaultValue": "Authorization"
38 | },
39 | {
40 | "name": "spring.security.jwt.refresh-header",
41 | "type": "java.lang.String",
42 | "sourceType": "site.zido.coffee.autoconfigure.security.rest.CoffeeSecurityProperties$JwtProperties",
43 | "defaultValue": "Refresh-Token"
44 | },
45 | {
46 | "name": "spring.security.jwt.refresh-secret",
47 | "type": "java.lang.String",
48 | "sourceType": "site.zido.coffee.autoconfigure.security.rest.CoffeeSecurityProperties$JwtProperties"
49 | },
50 | {
51 | "name": "spring.security.jwt.refresh-support",
52 | "type": "java.lang.Boolean",
53 | "sourceType": "site.zido.coffee.autoconfigure.security.rest.CoffeeSecurityProperties$JwtProperties",
54 | "defaultValue": false
55 | },
56 | {
57 | "name": "spring.security.jwt.renew-in-ms",
58 | "type": "java.lang.Long",
59 | "sourceType": "site.zido.coffee.autoconfigure.security.rest.CoffeeSecurityProperties$JwtProperties"
60 | },
61 | {
62 | "name": "spring.security.jwt.secret",
63 | "type": "java.lang.String",
64 | "sourceType": "site.zido.coffee.autoconfigure.security.rest.CoffeeSecurityProperties$JwtProperties"
65 | },
66 | {
67 | "name": "spring.security.phone-code-enable",
68 | "type": "java.lang.Boolean",
69 | "sourceType": "site.zido.coffee.autoconfigure.security.rest.CoffeeSecurityProperties",
70 | "defaultValue": true
71 | },
72 | {
73 | "name": "spring.security.phone-code.key-prefix",
74 | "type": "java.lang.String",
75 | "sourceType": "site.zido.coffee.autoconfigure.security.rest.CoffeeSecurityProperties$AuthorizationPhoneCodeProperties"
76 | },
77 | {
78 | "name": "spring.security.phone-code.timeout",
79 | "type": "java.lang.Long",
80 | "sourceType": "site.zido.coffee.autoconfigure.security.rest.CoffeeSecurityProperties$AuthorizationPhoneCodeProperties",
81 | "defaultValue": 0
82 | },
83 | {
84 | "name": "spring.security.secure-store-type",
85 | "type": "site.zido.coffee.autoconfigure.security.rest.SecureStoreType",
86 | "sourceType": "site.zido.coffee.autoconfigure.security.rest.CoffeeSecurityProperties"
87 | }
88 | ],
89 | "hints": []
90 | }
--------------------------------------------------------------------------------
/coffee-autoconfigures/coffee-autoconfigure-rest-security/src/main/resources/META-INF/spring.factories:
--------------------------------------------------------------------------------
1 | org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
2 | site.zido.coffee.autoconfigure.security.rest.RestSecurityAutoConfiguration,\
3 | site.zido.coffee.autoconfigure.security.rest.RestSecurityFilterAutoConfiguration,\
4 | site.zido.coffee.autoconfigure.security.rest.authorize.PhoneCodeAutoConfiguration,\
5 | site.zido.coffee.autoconfigure.security.rest.authorize.RedisPhoneCodeConfiguration
6 | org.springframework.boot.autoconfigure.AutoConfigurationImportFilter=\
7 | site.zido.coffee.autoconfigure.security.rest.WebSecurityAutoFilter
--------------------------------------------------------------------------------
/coffee-autoconfigures/coffee-autoconfigure-web/pom.xml:
--------------------------------------------------------------------------------
1 |
2 |
5 |
6 | coffee-autoconfigures
7 | site.zido
8 | 0.3.0-SNAPSHOT
9 |
10 | 4.0.0
11 |
12 | coffee-autoconfigure-web
13 |
14 |
15 | site.zido
16 | coffee-webmvc
17 |
18 |
19 |
20 |
--------------------------------------------------------------------------------
/coffee-autoconfigures/coffee-autoconfigure-web/src/main/java/site/zido/coffee/autoconfigure/web/CoffeeErrorMvcAutoConfiguration.java:
--------------------------------------------------------------------------------
1 | package site.zido.coffee.autoconfigure.web;
2 |
3 | import org.springframework.beans.factory.ObjectProvider;
4 | import org.springframework.boot.autoconfigure.AutoConfigureBefore;
5 | import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
6 | import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
7 | import org.springframework.boot.autoconfigure.condition.SearchStrategy;
8 | import org.springframework.boot.autoconfigure.web.ServerProperties;
9 | import org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController;
10 | import org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration;
11 | import org.springframework.boot.autoconfigure.web.servlet.error.ErrorViewResolver;
12 | import org.springframework.boot.context.properties.EnableConfigurationProperties;
13 | import org.springframework.boot.web.servlet.error.ErrorAttributes;
14 | import org.springframework.boot.web.servlet.error.ErrorController;
15 | import org.springframework.context.annotation.Bean;
16 | import org.springframework.context.annotation.Configuration;
17 | import org.springframework.context.annotation.Import;
18 | import org.springframework.http.HttpStatus;
19 | import org.springframework.http.MediaType;
20 | import org.springframework.http.ResponseEntity;
21 | import org.springframework.web.bind.annotation.RequestMapping;
22 | import site.zido.coffee.autoconfigure.web.basic.CoffeeErrorAttributes;
23 | import site.zido.coffee.mvc.rest.HttpResponseBodyConfiguration;
24 | import site.zido.coffee.mvc.rest.HttpResponseBodyFactory;
25 | import site.zido.coffee.mvc.rest.OriginalResponse;
26 |
27 | import javax.servlet.http.HttpServletRequest;
28 | import java.util.Map;
29 | import java.util.stream.Collectors;
30 |
31 | @Configuration
32 | @EnableConfigurationProperties({ServerProperties.class})
33 | @Import(HttpResponseBodyConfiguration.class)
34 | @AutoConfigureBefore(ErrorMvcAutoConfiguration.class)
35 | @ConditionalOnProperty(value = "spring.coffee.web.global-exception", matchIfMissing = true, havingValue = "true")
36 | class CoffeeErrorMvcAutoConfiguration {
37 | private final ServerProperties serverProperties;
38 |
39 | public CoffeeErrorMvcAutoConfiguration(ServerProperties serverProperties) {
40 | this.serverProperties = serverProperties;
41 | }
42 |
43 | @ConditionalOnMissingBean(value = ErrorAttributes.class, search = SearchStrategy.CURRENT)
44 | @Bean
45 | public CoffeeErrorAttributes errorAttributes(HttpResponseBodyFactory factory) {
46 | return new CoffeeErrorAttributes(this.serverProperties.getError().isIncludeException(), factory);
47 | }
48 |
49 | @Bean
50 | @ConditionalOnMissingBean(value = ErrorController.class, search = SearchStrategy.CURRENT)
51 | public BasicErrorController basicErrorController(ErrorAttributes errorAttributes,
52 | ObjectProvider errorViewResolvers) {
53 | return new BasicErrorController(errorAttributes, this.serverProperties.getError(),
54 | errorViewResolvers.orderedStream().collect(Collectors.toList())) {
55 | @RequestMapping
56 | @OriginalResponse
57 | public ResponseEntity