Reputation: 549
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);
}
}
Upvotes: 3
Views: 25795
Reputation: 6457
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);
}
}
Upvotes: 5