Dinámicamente cambiar entre archivos de propiedades basado en parámetros encabezado de la solicitud de aplicación de inicio de la primavera

Bruce Wayne :

Estoy desarrollando una aplicación de inicio de la primavera RESTO múltiples usuarios. Soy capaz de cambiar dinámicamente entre diferentes fuentes de datos en base a un valor de cabecera en cada petición. Pero mi problema está en el archivo application.properties. Los inquilinos tienen diferentes valores diferentes para las mismas propiedades en sus archivos de propiedades.

¿Cómo puedo separar los archivos de propiedades por inquilino y también determinar qué archivos dinámicamente propiedades a utilizar en función de un valor en el encabezado de la solicitud

Andy Brown:

No se puede cambiar de perfil en tiempo de ejecución. Sus opciones se limitan a, ya sea la creación de una nueva ApplicationContextque viene con sus propios inconvenientes o puede cargar los archivos de propiedades inquilino en el arranque y poner en práctica un inquilino específica getPropertymétodo a llamar cuando sea necesario.

Esto debe de manejar este último caso:

@Component
public class TenantProperties {

  private Map<String, ConfigurableEnvironment> customEnvs;

  @Inject
  public TenantProperties(@Autowired ConfigurableEnvironment defaultEnv,
      @Value("${my.tenant.names}") List<String> tenantNames) {

    this.customEnvs = tenantNames
        .stream()
        .collect(Collectors.toMap(
            Function.identity(),
            tenantId -> {
              ConfigurableEnvironment customEnv = new StandardEnvironment();
              customEnv.merge(defaultEnv);
              Resource resource = new ClassPathResource(tenantId + ".properties");

              try {
                Properties props = PropertiesLoaderUtils.loadProperties(resource);
                customEnv.getPropertySources()
                    .addLast(new PropertiesPropertySource(tenantId, props));
                return customEnv;
              } catch (IOException ex) {
                throw new RuntimeException(ex);
              }
            }));
  }

  public String getProperty(String tenantId, String propertyName) {

    ConfigurableEnvironment ce = this.customEnvs.get(tenantId);
    if (ce == null) {
      throw new IllegalArgumentException("Invalid tenant");
    }

    return ce.getProperty(propertyName);
  }
}

Es necesario añadir una my.tenant.namespropiedad a sus principales propiedades de la aplicación que contiene una lista separada por comas de los nombres de los inquilinos ( name1, name2, etc.). arrendatario propiedades específicas se cargan desde name1.properties... desde la ruta de clase. Se entiende la idea.

Supongo que te gusta

Origin http://43.154.161.224:23101/article/api/json?id=312686&siteId=1
Recomendado
Clasificación