java - 扩展阔叶默认管理 Controller

标签 java spring broadleaf-commerce

我想为管理端(broadleaf 框架)创建自己的 Controller ,它扩展了 AdminBasicEntityController。 这是我的 Controller 代码:

    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

我的 Controller 出了什么问题。我在guide上看到了指南

更新 如果我添加 @RequestMapping({"/admin/pages"})在类级别,我的 Controller 方法将被忽略,并且相同的父类方法可以工作。为什么?

非常感谢!

最佳答案

你们很接近!要覆盖现有的 Broadleaf bean,请确保使用注释中声明的 bean 名称。将您的 bean 命名为“blAdminBasicEntityController”,如下所示:

@Bean
public AdminBasicEntityController blAdminBasicEntityController() {
    return new AdminArticleController();
}

您看到的错误是由于有两个具有相同映射的 bean 造成的。发生这种情况是因为 AdminBasicEntityController 带有 @Controller("blAdminBasicEntityController") 注释,这意味着它将通过组件扫描获取并创建一个名为 blAdminBasicEntityController 的 bean。由于 AdminArticleController 扩展了 AdminBasicEntityController,一旦创建了 AdminArticleController bean,AdminBasicEntityController 中的每个映射都会有 2 个映射。解决方案是覆盖 Broadleaf bean,而不是添加额外的 bean。

关于java - 扩展阔叶默认管理 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55005225/

相关文章:

java - 重新设计 Java 软件项目所需的流程、工具和管理技术

spring - 我可以在 Spring EL 中使用属性占位符吗?

java - 应用程序上下文加载很久以前在项目中删除的 Bean

css - 外部 CSS 在 Broadleaf 电子邮件模板中不起作用

javascript - 如何在 Broadleaf 管理面板中删除任何内容之前启用提示?

java - 从android在线数据库中插入数据

java - Android studio/Firebase - 遇到无限循环试图获取数据

javascript - 在 GET 中从另一个 J 调用 JavaScript 方法

java - 如何停止在 Spring-JDBC 中处理行?

java - 为什么选择 Broadleaf Commerce 而不是 Magento 或 ZenCart?