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