1

J'ai donc un ensemble de paquets qui sont mon code de base pour les applications étendues. Mon application implémente une série d'interfaces qui sont ensuite injectées par le printemps pendant l'exécution (comme configuré). Je voudrais savoir s'il existe un moyen de savoir quelle classe implémente l'interface a été injectée. J'en ai besoin car j'ai des actions de sérialiseur/désérialiseur JSON que je voudrais effectuer mais pour cela j'ai besoin de connaître la classe qui a été injectée.Comment savoir quel bean a été injecté dans l'interface?

J'ai un fichier de configuration java qui va décrire le câblage et il sera fourni avec la mise en œuvre du jeu. Mais jusqu'à présent, je n'ai pas réussi à obtenir la classe concrète implémentant l'interface. Je n'ai pas non plus réussi à demander cette information du contexte.

Conseils pour les fourmis?

+0

Si vous pouvez obtenir cela, alors le but des interfaces est perdu, non? – DNAj

+0

@DNAj Je comprends votre point de vue, mais sinon je ne serais pas capable de gérer la conversion JSON (Jackson), puisque j'utilise un POJO contenant une interface qui est supposée être implémentée par mon application. Pour sûr, il y a un problème de conception ici, mais je ne peux pas trouver comment le résoudre sans connaître la classe implémentée. – jfzr

+1

Salut @jfzr, alors vous avez l'option de réflexion seulement. En utilisant correctement la réflexion, vous pouvez également modifier les accesseurs et les rendre accessibles. Faites-moi savoir si vous avez besoin de plus d'informations à ce sujet. – DNAj

Répondre

0

La façon dont j'ai résolu ce problème consistait à injecter un objet dans le désérialiseur JSON et à utiliser une méthode getClass() comme modèle pour Jackson. Et cela a fonctionné comme un charme, même si l'implémentation à injecter était injectée dans un câblage qui se passait dans la dépendance! J'espère que cela aide!

2

Vous pouvez utiliser la réflexion pour laisser l'instance injectée vous indiquer la classe d'implémentation: injectedInstance.getClass().getName(). Cependant, à moins que vous ne fassiez quelque chose de spécial, considérez ceci comme un hack. Vous devriez probablement revoir votre conception afin que vous n'ayez pas besoin de faire cela.

+0

En effet, je pense que ça va être ma solution partielle alors que je résous ce problème de conception. Merci! – jfzr

1

Vous pouvez simplement lier automatiquement une interface et d'obtenir le nom de classe mis en œuvre:

@Autowired 
private Service service; 

System.out.println(service.getClass().getName()); 

Cependant, avec les haricots printemps le réservoir de printemps a l'habitude de les approximé il est donc pas toujours utile, dans le cas ci-dessus la classe est un ressort classe appelée:

hello.HelloServiceImpl$$EnhancerBySpringCGLIB$$ad2e225d 

Je pense que vous devriez regarder Jackson serializers qui devrait gérer tout cela, voir Java - Jackson Annotations to handle no suitable constructor