Не могу оценить приложение. после обновления SpringBoot с 2.0.6.RELEASE до 2.1.0.RELEASE - PullRequest
0 голосов
/ 01 ноября 2018

У меня есть базовое приложение SpringBoot 2.0.6.RELEASE. Использование Spring Initializer, JPA, встроенного Tomcat, механизма шаблонов Thymeleaf и пакета в качестве исполняемого JAR-файла с архитектурой restful Я обновил приложение SpringBoot. с 2.0.6.RELEASE до 2.1.0.RELEASE,

У меня есть этот класс конфигурации:

public class DevApplicationConfig {

     @Autowired
     private ErrorAttributes errorAttributes;

     @Bean
     public AppErrorController appErrorController(){
         return new AppErrorController(errorAttributes);
     }

}

Но после изменения я получил эту ошибку в Eclipse при запуске приложения:

***************************
APPLICATION FAILED TO START
***************************

Description:

The bean 'appErrorController', defined in class path resource [io/tdk/config/DevApplicationConfig.class], could not be registered. A bean with that name has already been defined in file [/Users/nunet/Documents/workspace-sts-3.9.2.RELEASE/tdk/target/classes/io/tdk/web/controllers/AppErrorController.class] and overriding is disabled. 

@Controller
public class AppErrorController  implements ErrorController {

    private static final Logger LOG = LoggerFactory.getLogger(AppErrorController.class);
    /**
     * Error Attributes in the Application
     */
    private ErrorAttributes errorAttributes;

    private final static String ERROR_PATH = "/error";

    @Autowired
    private EmailService emailService;

    @Value("${systemadmin.email}")
    private String systemAdminEmail;

    @Value("${webmaster.email}")
    private String webMasterEmail;

    /**
     * Controller for the Error Controller
     * @param errorAttributes
     */
    public AppErrorController(ErrorAttributes errorAttributes) {
        this.errorAttributes = errorAttributes;
    }

    /**
     * Supports the HTML Error View
     * @param request
     * @return
     */
    @RequestMapping(value = ERROR_PATH, produces = "text/html")
    public ModelAndView errorHtml(HttpServletRequest request, WebRequest webRequest) {

             SimpleMailMessage mailMessage = new SimpleMailMessage();
         mailMessage.setTo(systemAdminEmail);
         mailMessage.setSubject("System Error !");
         mailMessage.setText(getErrorAttributes(request, webRequest, true).toString());
         mailMessage.setFrom(webMasterEmail);

         emailService.sendGenericEmailMessage(mailMessage);



        return new ModelAndView(serverContextPath  +"/errors/error", getErrorAttributes(request, webRequest, true));
    }

    /**
     * Supports other formats like JSON, XML
     * @param request
     * @return
     */
    @RequestMapping(value = ERROR_PATH)
    @ResponseBody
    public ResponseEntity<Map<String, Object>> error(WebRequest webRequest, HttpServletRequest request) {
        Map<String, Object> body = getErrorAttributes( request, webRequest, true);
        HttpStatus status = getStatus(request);
        return new ResponseEntity<Map<String, Object>>(body, status);
    }


    /**
     * Returns the path of the error page.
     *
     * @return the error path
     * 
     */
    @Override
    public String getErrorPath() {
        return ERROR_PATH;
    }



    private Map<String, Object> getErrorAttributes(HttpServletRequest request, WebRequest webRequest,
            boolean includeStackTrace) {

            return this.errorAttributes.getErrorAttributes(webRequest, includeStackTrace);

    }

    private HttpStatus getStatus(HttpServletRequest request) {
        Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
        if (statusCode != null) {
            try {
                return HttpStatus.valueOf(statusCode);
            } catch (Exception ex) {
            }
        }
        return HttpStatus.INTERNAL_SERVER_ERROR;
    }

}

Ответы [ 2 ]

0 голосов
/ 26 ноября 2018

В Spring Boot 2.1 было внесено изменение, чтобы отключить переопределение bean-компонентов по умолчанию. Это было сделано, чтобы упростить идентификацию и исправление случайного переопределения компонента. Случайное переопределение - то, что, кажется, происходит здесь.

AppErrorController помечен @Controller, что означает @Component, и он, похоже, находится в пакете, который покрывается компонентным сканированием. Когда при сканировании компонента встречается AppErrorController, он определяет компонент с именем appErrorController.

DevApplicationConfig затем обрабатывается. Он содержит метод @Bean, который определяет компонент с именем appErrorController:

 @Bean
 public AppErrorController appErrorController(){
     return new AppErrorController(errorAttributes);
 }

В Spring Boot 2.0 и более ранних версиях это приведет к тому, что компонент AppErrorController, определенный посредством сканирования компонентов, будет переопределен компонентом, определенным в DevApplicationConfig. Если вы внимательно посмотрите журналы при запуске приложения с Spring Boot 2.0.x, вы должны увидеть, что для переопределенного компонента было зарегистрировано информационное сообщение. В Spring Boot 2.1 это приводит к сбою из-за того, что переопределение бина отключено по умолчанию.

Чтобы устранить проблему, удалите метод appErrorController @Bean из DevApplicationConfig. Это позволяет использовать определение, сгенерированное путем сканирования компонентов. Я бы порекомендовал сделать то же самое изменение в Spring Boot 2.0 и более ранних приложениях. Удаление ненужного переопределения делает запуск приложения немного более эффективным и позволяет избежать загромождения журналов вашего приложения информационными сообщениями о переопределении bean-компонентов.

Если вам нужно переопределить bean-компонент в Spring Boot 2.1, вы можете восстановить поведение 2.0, установив свойство:

spring.main.allow-bean-definition-overriding=true

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

0 голосов
/ 02 ноября 2018

добавить эту строку в файл applicaton.propertie s

spring.main.allow-bean-definition-overriding=true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...