Injecter de la portée de la requête de haricot dans un autre bean
Je veux créer un UUID qui est unique dans une demande de cycle de vie.
Pour ce faire, j'ai créer un UUID bean avec le @Scope("demande") annotation.
@Bean
@Scope(scopeName = WebApplicationContext.SCOPE_REQUEST)
public UUID requestUUID() {
return UUID.randomUUID();
}
Je veux accéder à ce bean dans mon contrôleur. J'ai donc injecter @Autocâblés.
Cela fonctionne très bien.
@Controller
public class DashboardController {
@Autowired
UUID uuid;
@Autowired
WelcomeMessageService welcomeMessageService;
@Autowired
IssueNotificationService issueNotificationService;
@RequestMapping("/")
public String index(Model model) throws InterruptedException, ExecutionException {
System.out.println(uuid);
PortalUserDetails userLog = getPortalUserDetails();
BusinessObjectCollection<WelcomeMessage> welcomeMessages = welcomeMessageService.findWelcomeMessages(
20,
0,
userLog.getZenithUser(),
userLog.getConnectionGroup().getConnectionGroupCode(),
"FR");
if(welcomeMessages!=null) {
model.addAttribute("welcomeMessages", welcomeMessages.getItems());
}
BusinessObjectCollection<IssueNotification> issueNotifications =
issueNotificationService.findIssueNotifications(userLog.getZenithUser());
if(welcomeMessages!=null) {
model.addAttribute("welcomeMessages", welcomeMessages.getItems());
}
model.addAttribute("issueNotifications", issueNotifications);
return "index";
}
}
Le contrôleur appel à plusieurs services. Chaque service utilise un RestTemplate bean. Dans ce RestTemplate bean, je veux obtenir l'UUID.
@Component
public class ZenithRestTemplate extends RestTemplate {
@Autowired
private UUID uuid;
public void buildRestTemplate() {
List restTemplateInterceptors = new ArrayList();
restTemplateInterceptors.add(new HeaderHttpRequestInterceptor("UUID", uuid.toString()));
this.setInterceptors(restTemplateInterceptors);
}
}
Lorsque j'essaie d'injecter de l'UUID ici, j'ai une erreur :
Erreur lors de la création de haricots avec le nom "zenithRestTemplate': Injection de autocâblés dépendances a échoué; nested exception est org.springframework.les haricots.usine.BeanCreationException: ne Peut pas autowire champ: java privé.util.L'UUID de la com.geodis.rt.zenith.cadre.l'interface utilisateur web.service.ZenithRestTemplate.uuid; nested exception est org.springframework.les haricots.usine.BeanCreationException: Erreur lors de la création de haricots avec le nom "requestUUID': Champ d'application "demande" n'est pas active pour le thread en cours; envisager de définir une étendue de proxy pour ce bean si vous avez l'intention de faire référence à partir d'un singleton; nested exception java.lang.IllegalStateException: Pas de fil lié demande trouvés: faites-vous allusion aux attributs de la requête en dehors d'une requête web, ou de traitement d'une demande à l'extérieur de l'origine de la réception de fil? Si vous êtes actuellement à l'intérieur d'une requête web et vous recevez toujours ce message, votre code est probablement courir à l'extérieur de la DispatcherServlet/DispatcherPortlet: Dans ce cas, utilisez RequestContextListener ou RequestContextFilter à exposer à la demande actuelle.
Que puis-je faire pour accéder à mon UUID de la fève à l'intérieur de la RestTemplate bean ?
Mon projet de l'utilisation de Spring-MVC, Spring-boot avec java configuration.
J'ai déjà essayé d'ajouter un RequestContextListener mais ça ne résout pas le problème.
@Bean public RequestContextListener requestContextListener(){
return new RequestContextListener();
}
OriginalL'auteur YLombardi | 2015-12-04
Vous devez vous connecter pour publier un commentaire.
Je pense que vous avez besoin de marquer votre
UUID
la portée de la requête bean comme:Où le contrôleur est
singleton
étendue bean vous êtes l'injection derequest
étendue de haricot. En tant que singleton haricots sont injectés en une seule fois par leur vie, vous devez fournir étendue de fèves de procurations qui prend soin de cela.Une autre option est d'utiliser à la place de la
org.springframework.web.context.annotation.RequestScope
annotation:@RequestScope
est un méta-annotation sur@Scope
que 1) définit lescope
à"request"
et 2) définit laproxyMode
àScopedProxyMode.TARGET_CLASS
de sorte que vous n'avez pas à le faire chaque fois que vous voulez définir une demande d'étendue de haricot.Edit:
Notez que vous devrez peut-être ajouter
@EnableAspectJAutoProxy
sur votre configuration principal de la classe.J'ai essayer quelques modification et j'ai eu une autre erreur qui dit que je ne peux pas sous-classe d'une classe finale (UUID de la classe est définitive). J'ai changer mon haricot UUID de la fève à l'utilisation d'une classe personnalisée avec un attribut UUID et maintenant ça fonctionne.
Merci pour la mention de EnableAspectJAutoProxy annotation. Je pense que c'était mon problème.
OriginalL'auteur Jan Zyka