I have a Spring MVC Controller in a very XML-slimmed application, we use a lot of annotations and as little config as possible. The Controller is working and it also has a number of resource values injected. But I’ve experienced a really strange behavior with this controller; annotated private fields referencing other components will not be injected.
This will not work.
@Controller
public class EntranceUnitController {
@Value("${remote.baseUrl}")
private String baseUrl = "http://localhost";
@Value("${remote.port}")
private String pushPort = "8080";
@Autowired
private HttpClientFactory httpClientFactory;
...
It seems that the httpClientFactory isn’t there yet when the private fields are set, if I set a break point to inspect the value there is of course null set when the controller is created.
BUT, if I make a setter for the component and annotate the set-method instead of the private field the controller works as expected.
@Controller
public class EntranceUnitController {
@Value("${remote.baseUrl}")
private String baseUrl = "http://localhost";
@Value("${remote.port}")
private String pushPort = "8080";
private HttpClientFactory httpClientFactory;
@Autowired
public void setHttpClientFactory(HttpClientFactory httpClientFactory) {
this.httpClientFactory = httpClientFactory;
}
...
To me this is really annoying. Isn’t the auto wiring injection for annotated values happening at the same time regardless injection point? I.e. why does it matter that the object is injected with a setter? I thought that private field injections are directly followed by constructs and setters, me start to think I’m wrong in that case…
Seems like your dependencies are in fact injected, you are just putting a breakpoint in the wrong moment (too early) and the dependencies aren’t injected yet, despite class being already created.
Remember that, unless you are using constructor injection, the first place where you can use injected dependencies is
@PostConstructmethod: