Я хочу создать свой собственный контроллер для административной части (широкий фреймворк), который расширяет AdminBasicEntityController. Вот мой код контроллера:
public class AdminArticleController extends AdminBasicEntityController {
@Autowired
private ArticleService articleService;
@Override
public String addEntity(HttpServletRequest request, HttpServletResponse response, Model model, @PathVariable Map<String, String> pathVars, @ModelAttribute("entityForm") EntityForm entityForm, BindingResult result) throws Exception {
return super.addEntity(request, response, model, pathVars, entityForm, result);
}
@Override
public String saveEntityJson(HttpServletRequest request, HttpServletResponse response, Model model, @PathVariable Map<String, String> pathVars, @PathVariable("id") String id, @ModelAttribute("entityForm") EntityForm entityForm, BindingResult result, RedirectAttributes ra) throws Exception {
return super.saveEntityJson(request, response, model, pathVars, id, entityForm, result, ra);
// articleService.updateArticleEntity();
}
}
Я также добавил следующий код в файл AdminServletConfig:
@Bean
public AdminBasicEntityController adminBasicEntityController() {
return new AdminArticleController();
}
И у меня проблема: Мой стек
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'adminControllerHandlerMapping' defined in URL [jar:file:/C:/Users/ntsarkevich/.m2/repository/org/broadleafcommerce/broadleaf-open-admin-platform/6.0.1-GA/broadleaf-open-admin-platform-6.0.1-GA.jar!/org/broadleafcommerce/openadmin/web/controller/AdminControllerHandlerMapping.class]: Invocation of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'adminBasicEntityController' method
public java.lang.String org.broadleafcommerce.openadmin.web.controller.entity.AdminBasicEntityController.addEntity(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse,org.springframework.ui.Model,java.util.Map<java.lang.String, java.lang.String>,org.broadleafcommerce.openadmin.web.form.entity.EntityForm,org.springframework.validation.BindingResult) throws java.lang.Exception
to {[/{sectionKey:.+}/add],methods=[POST]}: There is already 'blAdminBasicEntityController' bean method
public java.lang.String org.broadleafcommerce.openadmin.web.controller.entity.AdminBasicEntityController.addEntity(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse,org.springframework.ui.Model,java.util.Map<java.lang.String, java.lang.String>,org.broadleafcommerce.openadmin.web.form.entity.EntityForm,org.springframework.validation.BindingResult) throws java.lang.Exception mapped.
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1699) ~[spring-beans-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:573) ~[spring-beans-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:495) ~[spring-beans-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:317) ~[spring-beans-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:222) ~[spring-beans-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:315) ~[spring-beans-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:199) ~[spring-beans-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:759) ~[spring-beans-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:869) ~[spring-context-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:550) ~[spring-context-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:140) ~[spring-boot-2.0.4.RELEASE.jar:2.0.4.RELEASE]
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:762) [spring-boot-2.0.4.RELEASE.jar:2.0.4.RELEASE]
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:398) [spring-boot-2.0.4.RELEASE.jar:2.0.4.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:330) [spring-boot-2.0.4.RELEASE.jar:2.0.4.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1258) [spring-boot-2.0.4.RELEASE.jar:2.0.4.RELEASE]
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1246) [spring-boot-2.0.4.RELEASE.jar:2.0.4.RELEASE]
at com.community.admin.AdminApplication.main(AdminApplication.java:12) [classes/:?]
Caused by: java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'adminBasicEntityController' method
public java.lang.String org.broadleafcommerce.openadmin.web.controller.entity.AdminBasicEntityController.addEntity(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse,org.springframework.ui.Model,java.util.Map<java.lang.String, java.lang.String>,org.broadleafcommerce.openadmin.web.form.entity.EntityForm,org.springframework.validation.BindingResult) throws java.lang.Exception
to {[/{sectionKey:.+}/add],methods=[POST]}: There is already 'blAdminBasicEntityController' bean method
public java.lang.String org.broadleafcommerce.openadmin.web.controller.entity.AdminBasicEntityController.addEntity(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse,org.springframework.ui.Model,java.util.Map<java.lang.String, java.lang.String>,org.broadleafcommerce.openadmin.web.form.entity.EntityForm,org.springframework.validation.BindingResult) throws java.lang.Exception mapped.
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping$MappingRegistry.assertUniqueMethodMapping(AbstractHandlerMethodMapping.java:580) ~[spring-webmvc-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping$MappingRegistry.register(AbstractHandlerMethodMapping.java:544) ~[spring-webmvc-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.registerHandlerMethod(AbstractHandlerMethodMapping.java:265) ~[spring-webmvc-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.lambda$detectHandlerMethods$1(AbstractHandlerMethodMapping.java:250) ~[spring-webmvc-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at java.util.LinkedHashMap.forEach(LinkedHashMap.java:684) ~[?:1.8.0_171]
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.detectHandlerMethods(AbstractHandlerMethodMapping.java:248) ~[spring-webmvc-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.initHandlerMethods(AbstractHandlerMethodMapping.java:218) ~[spring-webmvc-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.afterPropertiesSet(AbstractHandlerMethodMapping.java:188) ~[spring-webmvc-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.afterPropertiesSet(RequestMappingHandlerMapping.java:136) ~[spring-webmvc-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1758) ~[spring-beans-5.0.8.RELEASE.jar:5.0.8.RELEASE]
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1695) ~[spring-beans-5.0.8.RELEASE.jar:5.0.8.RELEASE]
... 16 more
Что не так с моим контроллером. Я вижу руководство на гид
ОБНОВИТЬ
Если я добавлю @RequestMapping({"/admin/pages"}) к уровню класса, методы моего контроллера будут игнорироваться, и будут работать те же методы родительского класса. Почему?
Большое спасибо!
@pequals Да, я хочу переопределить функциональность: сохранить мою дополнительную сущность и использовать метод сохранения AdminBasicEntityController. Так что спасибо за совет - проблему решил, но методы моих контроллеров так и не используются
@pequals, мой родительский контроллер всегда перехватывает запрос, и вызывается родительский метод
Глядя на AdminProductController, похоже, что ваш метод переопределения в дочернем классе должен иметь @RequestMapping родительских методов.




Вы очень близко! Чтобы переопределить существующий компонент Broadleaf, обязательно используйте имя компонента, объявленное в аннотации. Назовите свой компонент «blAdminBasicEntityController» следующим образом:
@Bean
public AdminBasicEntityController blAdminBasicEntityController() {
return new AdminArticleController();
}
Ошибка, которую вы видите, связана с наличием двух компонентов с одинаковым отображением. Это происходит потому, что AdminBasicEntityController помечен @Controller("blAdminBasicEntityController"), что означает, что он будет обнаружен при сканировании компонентов и создаст bean-компонент с именем blAdminBasicEntityController. Поскольку AdminArticleController расширяет AdminBasicEntityController, после создания bean-компонента AdminArticleController будет 2 сопоставления для каждого сопоставления в AdminBasicEntityController. Решение состоит в том, чтобы переопределить bean-компонент Broadleaf вместо добавления дополнительного.
спасибо, это помогает решить проблему, но мой метод контроллера никогда не используется. Проверял через отладку. Используется только метод родительского контроллера, и я не могу понять, почему.
Итак, я меняю родительский класс на AdminPageController. Для AdminBasicEntityController метод getSectionKey() должен быть реализован или скопирован в дочерний контроллер.
Похоже, вы хотите переопределить функциональность сохранения либо пользовательского объекта (статьи), либо, возможно, все ваши продукты являются статьями. В первом случае вам нужно просто добавить
@RequestMappingна уровень класса с точным URL-адресом, который используется при сохранении вашей сущности, и переопределить не делайтеblAdminBasicEntityController. То, что у вас есть в вашем вопросе, будет работать, поскольку вы создали новое, более конкретное сопоставление. Для последнего вам нужно расширитьAdminProductControllerи переопределитьblAdminProductController, как предложил @mouse_8b.