J'ai Hava Un service Web Metro Jax-WS qui ressemble plus ou moins à ceci:
@WebService @Transactional public class UserManagementServiceImpl { @Resource private WebServiceContext context; ... }
3 Réponses :
Le problème avec Webservices et la gestion des transactions est que chacun crée une proxy de la classe, et le 2e à créer un proxy ne reçoit pas la réelle implémentation, mais le proxy (et les choses vont au sud). P>
Le moyen d'éviter que ceci est de déléguer tous les appels de la mise en œuvre de la mise en œuvre du novoir Web Webservice au service. Donc, vous aurez besoin de deux classes de béton: s. P>
Je ne sais pas si c'est la meilleure façon de le faire, mais c'est le meilleur que j'ai trouvé. P>
et em> cela pourrait nettoyer le code un peu, comme on dirait que le gestionnaire d'utilisateurs se soucie de Webservices, qui n'a pas l'air bien. P>
J'ai trouvé une solution de contournement. Utilisez l'injection de Setter au lieu de l'injection de champ:
@WebService @Transactional public class UserManagementServiceImpl { private WebServiceContext context; @Resource public void setContext(WebServiceContext context) { this.context = context; } ... }
Je soupçonne que cela peut causer des problèmes lors de la manipulation d'appels simultanés sur le service Web depuis le servlet Singleton, toutes les données d'instance sont "partagées" par tous les threads - votre "contexte privé" restera donc remplacé par le prochain appel même pendant que vous êtes toujours occupé avec un appel précédent. Peut-être quelque chose comme
La classe met-elle en œuvre une interface? Dans ce cas, il pourrait avoir quelque chose à voir avec le problème expliqué dans cette question: Stackoverflow. com / questions / 2713033 / AutoWire-Strange-Problème