Весенняя пакетная конфигурация на основе Java с автоматическим подключением не работает - PullRequest
0 голосов
/ 09 мая 2019

Я пытаюсь преобразовать свой существующий весенний пакетный проект на основе XML в конфигурацию на основе Java.@Autowired объекты, возвращающие нуль, даже если я упомянул компонентcancan в базовом пакете.

Я попытался с помощью приведенного ниже кода в моем проекте, все объекты с @Autowired возвращают ноль.Объект UtilClass не подключен автоматически в моем RootServlet, получая исключение nullpointer

web.xml

    <context-param>
        <param-name>contextClass</param-name>
        <param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
    </context-param>
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>com.batch.sample.AppConfig</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <servlet>
        <servlet-name>RootServlet</servlet-name>
        <servlet-class>com.batch.sample.servlet.RootServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>RootServlet</servlet-name>
        <url-pattern>/execute</url-pattern>
    </servlet-mapping>

AppConfig.java

import org.springframework.batch.core.configuration.annotation.EnableBatchProcessing;
import org.springframework.batch.core.configuration.annotation.JobBuilderFactory;
import org.springframework.batch.core.configuration.annotation.StepBuilderFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;

@Configuration
@EnableBatchProcessing
@ComponentScan("com.batch.sample")
public class AppConfig {
    @Autowired
    private JobBuilderFactory jobs;

    @Autowired
    private StepBuilderFactory steps;

    //Job beans not included
}

RootServlet.java

package com.batch.sample.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.batch.core.Job;
import org.springframework.batch.core.JobParameters;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import com.batch.sample.util.UtilClass;

@Component
public class RootServlet extends HttpServlet {

    @Autowired
    UtilClass utilClass;

    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        JobLauncher jobLauncher = utilClass.getJobLauncherObject();
        Job job = utilClass.getJobObject();
        try {
            jobLauncher.run(job, new JobParameters());
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

UtilClass.java

package com.batch.sample.util;

import org.springframework.batch.core.Job;
import org.springframework.batch.core.launch.JobLauncher;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;

@Component
public class UtilClass {

    public Job getJobObject() {
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
        return context.getBean("dataLoaderJob",Job.class);
    }

    public JobLauncher getJobLauncherObject() {
        AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext();
        return context.getBean(JobLauncher.class);
    }
}

Ответы [ 2 ]

0 голосов
/ 13 мая 2019

Вы заново создаете пустой контекст приложения в UtilClass, который не знает о ваших бинах Spring Batch, определенных в com.batch.sample.AppConfig.Поскольку UtilClass управляется Spring (с пометкой @Component), вы можете добавить контекст приложения:

@Component
public class UtilClass {

   @Autowired
   private ApplicationContext context;

   public Job getJobObject() {
      return context.getBean("dataLoaderJob",Job.class);
   }

   public JobLauncher getJobLauncherObject() {
      return context.getBean(JobLauncher.class);
   }
}
0 голосов
/ 10 мая 2019

Пожалуйста, убедитесь, что ваш класс с методом main всегда находится в родительском / корневом пакете

Например

com.google.application
           -ClassWithMainMethod
com.google.application.job
com.google.application.job.listener
com.google.application.job.service
com.google.application.job.utils
com.google.application.job.repository
com.google.application.job.components
com.google.application.job.configuration
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...