Я использую Spring AOP и, следовательно, косвенно CGLIB в моем MVC-контроллере Spring. Поскольку CGLIB нужен конструктор по умолчанию, я включил один, и мой контроллер теперь выглядит следующим образом:
@Controller
public class ExampleController {
private final ExampleService exampleService;
public ExampleController(){
this.exampleService = null;
}
@Autowired
public ExampleController(ExampleService exampleService){
this.exampleService = exampleService;
}
@Transactional
@ResponseBody
@RequestMapping(value = "/example/foo")
public ExampleResponse profilePicture(){
return this.exampleService.foo(); // IntelliJ reports potential NPE here
}
}
Теперь проблема заключается в том, что анализ статического кода IntelliJ IDEA сообщает о потенциальном исключении NullPointerException, поскольку this.exampleService
может быть нулевым.
Мой вопрос:
Как предотвратить эти ложноположительные предупреждения с нулевым указателем? Одним из решений было бы добавить assert this.exampleService != null
или, возможно, использовать Guava Preconditions.checkNotNull(this.exampleService)
.
Однако это должно быть добавлено к каждому методу для каждого поля, используемого в этом методе. Я бы предпочел решение, которое я мог бы добавить в одном месте. Может быть, аннотация для конструктора по умолчанию или что-то еще?
EDIT:
Кажется, что исправлено с помощью Spring 4, однако в настоящее время я использую Spring 3: http://blog.codeleak.pl/2014/07/spring-4-cglib-based-proxy-classes-with-no-default-ctor.html