Spring Batch Admin + Spring Boot-模糊映射.无法映射'org.springframework.batch.admin.web.JobController#1'方法 [英] Spring Batch Admin + Spring Boot - Ambiguous mapping. Cannot map 'org.springframework.batch.admin.web.JobController#1' method

查看:77
本文介绍了Spring Batch Admin + Spring Boot-模糊映射.无法映射'org.springframework.batch.admin.web.JobController#1'方法的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试使用 spring-batch-admin使用Spring Batch Admin UI -样本 项目.

I am trying to have Spring Batch Admin UI using spring-batch-admin-samples project.

我的工作使用Spring Boot,并且我已经更改了主要应用程序类,以使用

My job uses Spring Boot and I have changed my main application class to be deployable to Weblogic using this link.

因此应用程序类看起来像

So application class looks like,

@SpringBootApplication(exclude = { HypermediaAutoConfiguration.class,
        MultipartAutoConfiguration.class })
@EnableBatchAdmin
public class MyApplication extends SpringBootServletInitializer
        implements WebApplicationInitializer {

    @Override
    protected SpringApplicationBuilder configure(
            SpringApplicationBuilder builder) {
        return configureApplication(builder);
    }

    public static void main(String[] args) {
        configureApplication(new SpringApplicationBuilder()).run(args);
    }

    private static SpringApplicationBuilder configureApplication(
            SpringApplicationBuilder builder) {
        return builder.sources(MyApplication.class).bannerMode(Banner.Mode.OFF);
    }
}

我也从配置类中删除了@EnableBatchProcessing.

I have removed - @EnableBatchProcessing from configuration class too.

到目前为止,我收到了很多错误(超过10个),并且可以通过重写xmls或添加属性来克服每个错误.

I received quite a few errors till now ( more than 10 ) and was able to get past each by overriding xmls etc or by adding properties.

下面的错误是我无法解决的,

This below error is what I am not able to fix,

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping': Invocation of init method failed; nested exception is java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'org.springframework.batch.admin.web.JobController#1' method 
public java.lang.String org.springframework.batch.admin.web.JobController.launch(org.springframework.ui.ModelMap,java.lang.String,org.springframework.batch.admin.web.LaunchRequest,org.springframework.validation.Errors,java.lang.String)
to {[/jobs/{jobName}],methods=[POST]}: There is already 'org.springframework.batch.admin.web.JobController#0' bean method
public java.lang.String org.springframework.batch.admin.web.JobController.launch(org.springframework.ui.ModelMap,java.lang.String,org.springframework.batch.admin.web.LaunchRequest,org.springframework.validation.Errors,java.lang.String) mapped.
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1578)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:545)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:482)
    at org.springframework.beans.factory.support.AbstractBeanFactory$1.getObject(AbstractBeanFactory.java:306)
    at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:230)
    at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:302)
    at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:197)
    at org.springframework.beans.factory.support.DefaultListableBeanFactory.preInstantiateSingletons(DefaultListableBeanFactory.java:776)
    at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:861)
    at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:541)
    at org.springframework.boot.context.embedded.EmbeddedWebApplicationContext.refresh(EmbeddedWebApplicationContext.java:122)
    at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:759)
    at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:369)
    at org.springframework.boot.SpringApplication.run(SpringApplication.java:313)
    at org.springframework.boot.builder.SpringApplicationBuilder.run(SpringApplicationBuilder.java:134)
    at com.hms.responsematching.batch.ResponseMatchingApplication.main(ResponseMatchingApplication.java:25)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
    at java.lang.reflect.Method.invoke(Unknown Source)
    at org.springframework.boot.loader.MainMethodRunner.run(MainMethodRunner.java:48)
    at org.springframework.boot.loader.Launcher.launch(Launcher.java:87)
    at org.springframework.boot.loader.Launcher.launch(Launcher.java:50)
    at org.springframework.boot.loader.WarLauncher.main(WarLauncher.java:59)
Caused by: java.lang.IllegalStateException: Ambiguous mapping. Cannot map 'org.springframework.batch.admin.web.JobController#1' method 
public java.lang.String org.springframework.batch.admin.web.JobController.launch(org.springframework.ui.ModelMap,java.lang.String,org.springframework.batch.admin.web.LaunchRequest,org.springframework.validation.Errors,java.lang.String)
to {[/jobs/{jobName}],methods=[POST]}: There is already 'org.springframework.batch.admin.web.JobController#0' bean method
public java.lang.String org.springframework.batch.admin.web.JobController.launch(org.springframework.ui.ModelMap,java.lang.String,org.springframework.batch.admin.web.LaunchRequest,org.springframework.validation.Errors,java.lang.String) mapped.
    at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping$MappingRegistry.assertUniqueMethodMapping(AbstractHandlerMethodMapping.java:576)
    at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping$MappingRegistry.register(AbstractHandlerMethodMapping.java:540)
    at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.registerHandlerMethod(AbstractHandlerMethodMapping.java:264)
    at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.detectHandlerMethods(AbstractHandlerMethodMapping.java:250)
    at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.initHandlerMethods(AbstractHandlerMethodMapping.java:214)
    at org.springframework.web.servlet.handler.AbstractHandlerMethodMapping.afterPropertiesSet(AbstractHandlerMethodMapping.java:184)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping.afterPropertiesSet(RequestMappingHandlerMapping.java:128)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1637)
    at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1574)
    ... 23 common frames omitted

我可以想到两个问题,

1. org .springframework.batch.admin.web.JobController 具有两个具有相同URL但具有不同HTTP方法的方法-launch& details.

1.org.springframework.batch.admin.web.JobController has two methods with same URL but different HTTP methods - launch & details.

<dependency>
        <groupId>org.springframework.batch</groupId>
        <artifactId>spring-batch-admin-manager</artifactId>
        <version>2.0.0.BUILD-SNAPSHOT</version>
</dependency>

    spring-batch-admin-resources 项目中的
  1. web.xml使用来自两个xml的contextConfigLocation,因此可能存在上下文加载问题.

  1. web.xml in spring-batch-admin-resources project uses contextConfigLocation from two xmls so there might be a context loading issue.

<context-param><param-name>contextConfigLocation</param-name> <param-value>classpath*:/org/springframework/batch/admin/web/resources/webapp-config.xml</param-value> </context-param>

<servlet>
        <servlet-name>Batch Servlet</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath*:/org/springframework/batch/admin/web/resources/servlet-config.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>

请提出建议,并让我知道是否需要更多详细信息.

Please suggest and let me know if any more details needed.

编辑:通过查看

EDIT: By looking at accepted answer of this question, it seems that same URL can be applied to different HTTP methods and that would not produce error. Cause is somewhere else.

我只是不了解运行 spring-batch-admin-samples ,但是尝试使用自己的类似代码时开始出现问题.应用程序类别与示例中提到的类别相同.当您尝试通过覆盖下面提到的这两个xml来解决有关对象映射器的以下问题时,开始收到问题映射问题.

I just don't understand that how come everything works OK when running jar of spring-batch-admin-samples project. but start receiving issues when try on own similar code. Application class is same as mentioned in samples. You start receiving issue mapping issue when try to fix below issue about object mappers by overriding these two below mentioned xmls.

Constructor in org.springframework.boot.actuate.autoconfigure.EndpointMBeanExportAutoConfiguration required a single bean, but 2 were found:
    - jacksonMapper: defined in URL [jar:file:/D:/RunRC/ResponseMatching/ResponseMatchingWithAdmin-0.0.1-SNAPSHOT.jar!/BOOT-INF/lib/spring-batch-admin-resources-2.0.0.BUILD-SNAPSHOT.jar!/META-INF/spring/batch/servlet/resources/resources-context.xml]
    - objectMapper: defined in URL [jar:file:/D:/RunRC/ResponseMatching/ResponseMatchingWithAdmin-0.0.1-SNAPSHOT.jar!/BOOT-INF/lib/spring-batch-admin-manager-2.0.0.BUILD-SNAPSHOT.jar!/META-INF/spring/batch/servlet/manager/controller-context-legacy.xml]


Action:

Consider marking one of the beans as @Primary, updating the consumer to accept multiple beans, or using @Qualifier to identify the bean that should be consumed

完成覆盖没有任何条目/空文件或单个条目(如<bean id="objectMapper" class="com.fasterxml.jackson.databind.ObjectMapper" primary="true"/>)的controller-context-legacy.xml没有影响.

Overriding controller-context-legacy.xml with no entries / empty file or a single entry like , <bean id="objectMapper" class="com.fasterxml.jackson.databind.ObjectMapper" primary="true"/> has no impact.

总而言之,我只是想在工作中运行上述示例项目.区别在于,示例项目使用Gradle,而我使用Maven来构建项目.我的工作已经使用Maven编写,因此继续进行.

All in all, I simply want to run said sample project with my job. One difference being that sample project used Gradle while I use Maven to build my project. My job was already written using Maven so continued with that.

推荐答案

经过几天的试用和试用,我能够使Sample Github项目工作正常.两个根本原因

After few days of hit and trial, I am able to get that Sample Github project working for my job. Two root causes,

1. @Configuration& @SpringBootApplication在同一包中完成我的工作:我的上下文被初始化了两次,因为我将两个类都放在同一个包中,所以我不得不将配置类移到与主类不同的包中.

1.@Configuration & @SpringBootApplication being in same package for my job: My context was getting initialized twice because I had both classes in same package so I had to move configuration class to a different package than main class.

2. Spring Boot版本::当我的作业使用1.4.0.RELEASE时,示例项目在Spring Boot版本1.2.2.RELEASE中编码,这导致了objectMapper问题. Project在1.2.2.RELEASE和最新版本1.5.2.RELEASE中都可以使用,所以我将自己升级到了1.5.2.RELEASE.

2.Spring Boot Version: Sample project is coded in Spring Boot Version 1.2.2.RELEASE while My job was using 1.4.0.RELEASE and that was causing objectMapper issues. Project worked with 1.2.2.RELEASE and also with latest version, 1.5.2.RELEASE so I upgraded myself to 1.5.2.RELEASE.

我遇到了其他各种问题,

I faced various other issues with,

  • JNDI数据源使用

  • JNDI data source Use

应用上下文路径更改

通过Spring Scheduler启动工作

Launching Job via a Spring Scheduler

登录日志

读取非标准启动属性

,我的部署环境是Weblogic,而RDBMS是DB2.我能够解决所有这些问题,主要是我的 spring-batch-admin-manager API的主要XML.

and my deployment environment was Weblogic and RDBMS being DB2. I was able to solve all these issues mostly my overriding XMLs of spring-batch-admin-manager API.

希望这对任何以该示例项目为起点的人都有帮助.

Hope this helps to anybody going to use that sample project as starting point.

这篇关于Spring Batch Admin + Spring Boot-模糊映射.无法映射'org.springframework.batch.admin.web.JobController#1'方法的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆