0

I need such a usage:

For each request I want to inject userId into DemoController But because of being a final class without empty constructor I can not inject it. What is the best practice in such cases? A service with request scope is fine?

@Configuration
public class CityFactory{

   @Bean(name = {"currentUserId")
   @Scope(value = WebApplicationContext.SCOPE_REQUEST,proxyMode = ScopedProxyMode.TARGET_CLASS)
   @Autowired
   public Integer getUserId(HttpServletRequest request) {
       return UserUtil.getCurrentUserId(request.getServerName());
   }
}


@RequestMapping("/demo")
@Controller
public class DemoController {

    @Autowired
    Ingeter userId;

    @RequestMapping(value = "/hello/{name}", method = RequestMethod.GET)
    public ModelAndView helloWorld(@PathVariable("name") String name, Model model) {
        Map<String, Object> myModel = new HashMap<String, Object>();
        model.addAttribute("user", userId);
        return new ModelAndView("v3/test", "m", model);
    }
}
Sean Patrick Floyd
  • 292,901
  • 67
  • 465
  • 588
Ozgur
  • 137
  • 2
  • 16

2 Answers2

3

Your best bet is to create an explicit class called UserId, which in turn contains an integer. Not only will this play nicer with CGLIB's proxying, it also clarifies your design.

skaffman
  • 398,947
  • 96
  • 818
  • 769
  • 1
    For such suggestion, I prefer AtomicInteger class which is provided at concurrency package already. Thanks. Any other idea? – Ozgur Feb 19 '11 at 20:55
0

You can use Supplier or Provider

@Configuration
public class CityFactory{

   @Bean
   @Autowired
   public Supplier<Integer> getUserId(HttpServletRequest request) {
       return () -> UserUtil.getCurrentUserId(request.getServerName());
   }
}
@RequestMapping("/demo")
@Controller
public class DemoController {

    @Autowired
    Supplier<Ingeter> getUserId;