Spring Bean and @Autowired constructor with params

autowired, java, javabeans, spring

Solution

The problem is that you are accessing a property in the constructor that is not valued yet: Spring must create the object before it can set the @Autowired property rt. Either add the argument `RoutesTest rt` to the constructor, or move your constructor logic to an `afterPropertiesSet` method.

Here is how to change your class that is failing, using the constructor:

@Component
@Scope("prototype")
public class HomeControllerTest {

    private RoutesTest rt;

    @Autowired
    public HomeControllerTest(FooTest req, RoutesTest rt)
    {
        this.rt = rt;
        String foo = rt.getUrl("caca");

        System.out.println(foo);
    }

}

Problem

I would like to understand if is possible to use and how can I do to do a Bean with a @Autowired Constructor and params. ``` @Component public class Routes { private Foo req; @Autowired public Routes(Foo req) { this.req = req; } public String getUrl(String destin) { return req.getContextPath() + destin; } } @Component public class HomeController { @Autowired private Routes routes; public HomeController(Foo req) { String foo = routes.getUrl("something"); } } ``` REAL CODE ------EDITING--------------- The exception is happening on the line: String foo = rt.getUrl("caca"); ``` public class AppRun extends HttpServlet { private static final long serialVersionUID = -3308874705513248491L; private ApplicationContext context; @Override public void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { context = WebApplicationContextUtils.getWebApplicationContext(getServletContext()); FooTest ft = new FooTest(); HomeControllerTest hc = (HomeControllerTest) context.getBean("homeControllerTest", new Object[]{ft}); } } @Component @Scope("prototype") public class FooTest { public String mensagem() { System.out.println("funcionou"); return "ok"; } } @Component @Scope("prototype") public class RoutesTest { private FooTest req; @Autowired public RoutesTest(FooTest req) { this.req = req; } public String getUrl(String destin) { return req.mensagem().concat(destin); } } @Component @Scope("prototype") public class HomeControllerTest { @Autowired private RoutesTest rt; public HomeControllerTest(FooTest req) { String foo = rt.getUrl("caca"); System.out.println(foo); } } ```

Original source