2009-10-08 10 views
0

Récemment, j'ai rencontré une erreur très embarrassante en essayant de nettoyer mes configs de printemps. L'exception était jetée au plus profond d'une bibliothèque tierce et était fondamentalement une NPE obfusquée. Ce que je voudrais être en mesure de faire est de configurer spring pour exiger un champ spécifique sur cette classe comme étant nécessaire, mais je ne veux pas construire une version personnalisée de la bibliothèque. Une solution évidente serait de sous-classer et marquer le setter là, mais par curiosité je me demandais s'il y avait un moyen facile de le faire au printemps sans avoir à faire le jonglage de classe.Marquage d'une propriété de classe tierce comme requis (Java/Spring)

Java 6u10, ressort 2.5.

+0

Clarification: J'essaie d'ajouter une annotation @Required à un setter spécifique auquel je n'ai pas accès, pas d'injection de dépendance spécifique. C'est un problème de métadonnées de classe, pas d'initialisation. – liam

+0

@liam - Je comprends ce que vous voulez maintenant, pour une raison que vous avez mentionnée, la sous-classe m'a déconcerté. S'il vous plaît voir la mise à jour dans ma réponse. – ChssPly76

Répondre

2

Écrivez un FactoryBean pour votre objet. Le sous-classement n'est pas nécessaire.

Mise à jour (basé sur les commentaires/clarification de la question)

Je comprends enfin ce que vous essayez de faire maintenant :-) Il n'y a rien au printemps qui ferait ce que vous voulez, mais il est assez trivial écrire. Vous envisagez essentiellement d'étendre org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor sauf que vous spécifiez les noms de classe/méthode de bean de manière statique au lieu de vous fier à leur annotation. Vous devrez remplacer la méthode isRequiredProperty().

+0

Peut-être qu'il me manque quelque chose, mais je ne vois pas comment cela pourrait aider. Plus précisément, je demande d'ajouter un @Required à une méthode spécifique, pas d'initialiser les champs à une valeur spécifique. Je ne comprends pas comment écrire une usine me permettra de définir des métadonnées sur les méthodes. – liam

+0

@Required n'est pas le seul moyen de s'assurer que la propriété spécifique est définie; vous pouvez le faire manuellement dans le callback d'initialisation que vous pouvez obtenir à partir de FactoryBean ou en sous-classant et en implémentant InitializingBean comme suggéré par Gandalf. Ou vous pouvez annoter le setter correspondant sur FactoryBean avec @Required. – ChssPly76

+0

Je comprends que je peux tester manuellement les champs, je ne vois vraiment pas l'intérêt d'écrire une usine, ou d'avoir un constructeur qui fait le travail à la place de la simple sous-classe. Idéalement, je cherche un moyen que je pourrais mettre en place une section dans mes configs de printemps où: - Je donne un nom de classe pleinement qualifié, et une liste de modèle de méthodes Spring applique la même logique et imprime la même erreur en utilisant @Required. Si je trouve d'autres propriétés sur les classes dont mon application a besoin, je pourrais les ajouter pour faire des contrôles de démarrage. Je suppose qu'il n'y en a pas. Merci pour les suggestions, cependant. – liam

1

Je voudrais écrire une classe qui étend votre classe actuelle et implémente l'interface InitalizingBean dans Spring qui vérifie les champs que vous spécifiez.

+0

En sous-classe, et en marquant les méthodes comme @Required est ce que je prévois, je me demande spécifiquement s'il existe une façon AOP-style de marquage des méthodes/classes comme requis par les configs. La manière dont spring/hibernate vous permet de définir des coupes de points pour les transactions. – liam

+0

Je vais avec ma sous-classe triviale originale. En général, je cherchais un moyen de marquer des setters tiers comme requis sans sous-classer ou compiler une version personnalisée du pot. Merci pour la suggestion, cependant. – liam

Questions connexes