Получение NullpointerException с автопроводкой в ​​springboot (странный сценарий) - PullRequest
0 голосов
/ 22 ноября 2018

Я знаю, что на этот конкретный вопрос есть многочисленные ответы, и я знаю о различных сценариях, из-за которых это может происходить.

Но я полагаю, что я не прав, я не знаю всех возможных комбинаций, указанныхмоя ситуация.Позвольте мне поделиться фрагментами кода, чтобы код мог говорить сам за себя.

Класс контроллера

@RestController
public class ReportController {

    @Autowired
    ReportFactory reportFactory;

    //RequestMapping goes here!
    public ResponseEntity<Report> getReport() {

        ReportGenerator<?> reportGenerator = reportFactory.getReportGenerator("order"); //line# 43
        return getSuccessResponse(reportGenerator.getReport(companyGUID, startDate, endDate)); //geting the exception here saying reportGenerator is null!
    }

    @SuppressWarnings({ "rawtypes", "unchecked" })
    private <T> ResponseEntity getSuccessResponse(T response) {
        return new ResponseEntity(response, HttpStatus.OK);
    }
}

Я получаю reportGenerator, который находится в строке# 43, который приводит меня к ReportFactory, который, как вы можете видеть, должен быть с автопроводкой .

ReportFactory.java

@Component
public class ReportFactory {

    @Autowired
    Map<String, ReportGenerator> reportList;

    public ReportGenerator<?> getReportGenerator(String reportType) {

        return reportList.get(reportType.toLowerCase());
    }
} 

Как видите, классс пометкой Component и другой зависимостью reportList, этот bean-компонент происходит из класса ниже.

ReportGeneratorConfig.java

 @Configuration
    public class ReportGeneratorConfig {

        @Autowired
        BeanFactory factory;

        @Bean
        public Map<String, ReportGenerator> reportList() {

            HashMap<String, ReportGenerator> reportList = new HashMap<String, ReportGenerator>();
            reportList.put("order", factory.getBean(OrderReportGeneratorImpl.class)); 
            //OrderReportGeneratorImpl implements ReportGenerator
            return reportList; //created the bean which should be autowired wherever needed!
        }
    }

Когда я запускал код в отладкеЯ вижу, что класс config фактически создает бин и автоматически подключает его к ReportFactory.Однако тот же компонент ReportFactory не подключается автоматически к классу контроллера.

Кроме того, после завершения инициализации компонента экземпляр reportFactory имеет нулевое значение в reportlist.экземпляр в controller, когда я проверяю значение отладки

Но у reportlist есть две совершенно разные записи, которые нигде не упоминаются, в классе reportFactory.

С этим Пожалуйста, помогите мне здесь!

PS Это веб-приложение, и я использую springBoot.

1 Ответ

0 голосов
/ 17 декабря 2018

Для кого-то, кто мог бы посетить это позже.

Как предложено mallikarjun, мне помогло следующее изменение.

ReportFactory.java

@Component
public class ReportFactory {

    @Resource // It was autowired here
    Map<String, ReportGenerator> reportList;

    public ReportGenerator<?> getReportGenerator(String reportType) {

        return reportList.get(reportType.toLowerCase());
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...