복붙노트

[SPRING] ArrayList를 org.springframework.batch.core.JobParameter에 캐스트 할 수 없습니다.

SPRING

ArrayList를 org.springframework.batch.core.JobParameter에 캐스트 할 수 없습니다.

나는 Spring Batch에서 일을 시작할 웹 서비스를 위해 나머지 고객으로부터리스트를 보내고 싶다. 작업을 시작하고 database / flatfile에서 입력 값을 읽기 전에 데이터베이스 / flatfile에 목록을 저장해야합니까? 어떤 사람은 Jira 문제 (아래 참조)에서 어떻게하는지 지적했지만 적어도 앞으로 나아갈 수있는 기본적인 생각을 이해할 수는 없었습니다. 컨트롤러 아래에 배치하고 JobParameter로 캐스팅하려고합니다. 나는 Jira 링크와 아마도 가능한 방향을 놓았지만 실제로이 Jira 문제에 대한 제안을 이해하지 못했습니다. 나는 SoapUi 클라이언트 아래에 추가하고 마지막으로 전체 오류 로그의 맨 아래에 붙여 넣습니다.

내 컨트롤러 :

@RequestMapping(value = "runit/family", method = RequestMethod.POST)
       public void handle(@RequestBody List<Person> myFamily) throws Exception {
              System.out.println(myFamily); //until here, it is fine

              JobParameters jobParameters = new JobParametersBuilder()
                           .addParameter("parametersReceived", (JobParameter) myFamily)
                           .addLong("time", System.currentTimeMillis()).toJobParameters();

              jobLauncher.run(job, jobParameters);
       }

SoapUi (게시물) :

[{"firstName":"aa","lastName":"bb"}]

Pojo

public class Person {

    private String lastName;
    private String firstName;
    ...getters and setters

작업 할 수있는 방법은 있지만이 Jira 문제에 대해 정말 혼란 스럽습니다. 솔직히, 나는 JobParameter로 시도하는 것보다 더 간단한 방법을 기대하고 있었다.

https://jira.spring.io/browse/BATCH-966 (this suggestion is from 2009. Probably some more up-to-date technique is available)
<bean class="MyItemReader">
<property name="dynamicValuesHashMap" ref="map"/>
...
</bean>

<bean class="MyLauncher">
<property name="dynamicValuesHashMap" ref="map"/>
...
</bean>

전체 오류 :

java.lang.ClassCastException: java.util.ArrayList cannot be cast to org.springframework.batch.core.JobParameter

       at hello.BatchController.handle(BatchController.java:42)

       at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

       at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

       at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

       at java.lang.reflect.Method.invoke(Method.java:497)

       at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221)

       at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137)

       at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110)

       at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:776)

       at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705)

       at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85)

       at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959)

       at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893)

       at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:967)

       at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:869)

       at javax.servlet.http.HttpServlet.service(HttpServlet.java:648)

       at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:843)

       at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)

       at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)

       at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

       at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

       at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)

       at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

       at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77)

       at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

       at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)

       at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

       at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:85)

       at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107)

       at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)

       at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)

       at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)

       at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)

       at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)

       at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)

       at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)

       at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)

       at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:518)

       at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1091)

       at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:668)

       at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1521)

       at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1478)

       at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)

       at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)

       at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)

       at java.lang.Thread.run(Thread.java:745)

해결법

  1. ==============================

    1.배치 작업은 시간 기반이 아닌 이벤트 기반으로 이루어집니다. 따라서 Rest 서비스의 정보를 Job 인스턴스로 전달할 수 없습니다. 컨트롤러 메소드에서 작업을 트리거하기 전에 목록을 임시 플랫 파일에 쓰거나 작업에서 읽을 수있는 데이터베이스에 저장하십시오.

    배치 작업은 시간 기반이 아닌 이벤트 기반으로 이루어집니다. 따라서 Rest 서비스의 정보를 Job 인스턴스로 전달할 수 없습니다. 컨트롤러 메소드에서 작업을 트리거하기 전에 목록을 임시 플랫 파일에 쓰거나 작업에서 읽을 수있는 데이터베이스에 저장하십시오.

  2. ==============================

    2.스프링 배치에 대한 메타 데이터를 저장하는 실제 스키마를 보면 작업에서 지원하는 사용 가능한 유형 목록을 매개 변수로 볼 수 있습니다 (string_val, date_val, long_val, double_val). 따라서 작업이 시작될 때 각 작업 매개 변수는 key_name을 매개 변수의 이름으로 사용하고 언급 된 _val 테이블 중 하나에 저장된 값으로 DB에 유지됩니다. type_cd는 유형이 사용 된 힌트를 제공합니다.

    스프링 배치에 대한 메타 데이터를 저장하는 실제 스키마를 보면 작업에서 지원하는 사용 가능한 유형 목록을 매개 변수로 볼 수 있습니다 (string_val, date_val, long_val, double_val). 따라서 작업이 시작될 때 각 작업 매개 변수는 key_name을 매개 변수의 이름으로 사용하고 언급 된 _val 테이블 중 하나에 저장된 값으로 DB에 유지됩니다. type_cd는 유형이 사용 된 힌트를 제공합니다.

    JobParameter에 대한 문서는 작업 매개 변수로 사용할 수있는 힌트를 제공합니다.

    가장 좋은 방법은 매개 변수 목록을 저장하는 DB에 테이블을 만들고 해당 레코드의 ID를 JobParameter로 전달하거나 list를 json으로 serialize하고 JobParameter로 작업중인 String으로 전달하는 것입니다. 두 번째 옵션을 사용하면 string_val이 DB에 varchar 250으로 저장되므로 limit은 250 자입니다.

  3. from https://stackoverflow.com/questions/31622248/arraylist-cannot-be-cast-to-org-springframework-batch-core-jobparameter by cc-by-sa and MIT license