Spring: How to do AND in Profiles?

前端 未结 7 1478
太阳男子
太阳男子 2020-12-25 10:40

Spring Profile annotation allows you to select profiles. However if you read documentation it only allows you to select more than one profile with OR operation. If you speci

7条回答
  •  一生所求
    2020-12-25 11:06

    A little bit improved version of @Mithun answer:

    public class AndProfilesCondition implements Condition {
    
    public static final String VALUE = "value";
    public static final String DEFAULT_PROFILE = "default";
    
    @Override
    public boolean matches(final ConditionContext context, final AnnotatedTypeMetadata metadata) {
        if (context.getEnvironment() == null) {
            return true;
        }
        MultiValueMap attrs = metadata.getAllAnnotationAttributes(Profile.class.getName());
        if (attrs == null) {
            return true;
        }
        String[] activeProfiles = context.getEnvironment().getActiveProfiles();
        String[] definedProfiles = (String[]) attrs.getFirst(VALUE);
        Set allowedProfiles = new HashSet<>(1);
        Set restrictedProfiles = new HashSet<>(1);
        for (String nextDefinedProfile : definedProfiles) {
            if (!nextDefinedProfile.isEmpty() && nextDefinedProfile.charAt(0) == '!') {
                restrictedProfiles.add(nextDefinedProfile.substring(1, nextDefinedProfile.length()));
                continue;
            }
            allowedProfiles.add(nextDefinedProfile);
        }
        int activeAllowedCount = 0;
        for (String nextActiveProfile : activeProfiles) {
            // quick exit when default profile is active and allowed profiles is empty
            if (DEFAULT_PROFILE.equals(nextActiveProfile) && allowedProfiles.isEmpty()) {
                continue;
            }
            // quick exit when one of active profiles is restricted
            if (restrictedProfiles.contains(nextActiveProfile)) {
                return false;
            }
            // just go ahead when there is no allowed profiles (just need to check that there is no active restricted profiles)
            if (allowedProfiles.isEmpty()) {
                continue;
            }
            if (allowedProfiles.contains(nextActiveProfile)) {
                activeAllowedCount++;
            }
        }
        return activeAllowedCount == allowedProfiles.size();
    }
    
    }
    

    Was unable to post it in the comments.

提交回复
热议问题