2017-09-28 4 views
0

Dans mon projet j'ai différents services. Chaque service peut définir ses propres Permission s. Pour chaque permission, un bean sera créé. De cette façon, le service Authorization peut injecter toutes les autorisations disponibles, sans les connaître.Lancer une exception si le bean est défini deux fois?

La définition Permission de ServiceA ressemblera à ceci:

@Configuration() 
public class ServiceAPermissions extends Permissions { 

    private static final String BASE = "servicea"; 
    public static final String SERVICEA_READ = join(BASE, READ); 
    public static final String SERVICEA_WRITE = join(BASE, WRITE); 

    @Bean() 
    Permission getReadPermission() { 
    return new Permission(SERVICEA_READ); 
    } 

    @Bean() 
    Permission getWritePermission() { 
    return new Permission(SERVICEA_WRITE); 
    } 
} 

ServiceB définira les Permission s suivantes:

@Configuration() 
public class ServiceBPermissions extends Permissions { 

    private static final String BASE = "serviceb"; 
    public static final String SERVICEB_READ = join(BASE, READ); 

    @Bean() 
    Permission getReadPermission() { 
    return new Permission(SERVICEB_READ); 
    } 
} 

De toute évidence, cela va finir dans un conflit de noms des grains définis comme J'ai défini un bean avec le nom getReadPermission deux fois. Si je peux bien sûr nommer les méthodes comme getServiceAReadPermission afin qu'ils soient distingués, mais ce n'est qu'une convention, qui pourrait être ignorée.

Dans cette situation, Spring ne m'avise pas de la définition en double, il instanciera simplement l'un et ignorera l'autre définition. Existe-t-il un moyen de dire à Spring de lancer un Exception, si un bean est défini deux fois? De cette façon, on serait toujours au courant d'une définition en double.

Alternativement, est-il un moyen de dire au printemps, qu'il devrait utiliser un nom de bean aléatoire au lieu de la signature de la méthode? Je sais que je peux donner un nom manuellement à chaque bean @Bean(name = "A name"), mais j'aime éviter cela, car un dev ne sera pas obligé de le faire et pourrait l'oublier.

+0

probablement vous pouvez mettre en œuvre la vérification requise par l'enregistrement d'un BeanPostProcessor qui jetterait une exception en cas de double des haricots. – Ivan

Répondre

0

Cette conception ne semble pas très logique. Un haricot est supposé être disponible une seule fois, vous l'utilisez différemment.

Je vous suggère de fournir un PermissionFactory-Bean qui fait ce que vous avez besoin, le long de la ligne de

@Component 
public class PermissionFactory { 
    public Permission createFactory() { 
     // create A or B permission randomly, as you wanted 
    } 
} 
+0

Merci, j'ai choisi une usine qui enregistre des haricots. Cela fonctionne parfaitement et je peux réagir à un bean de permission déjà existant. –