CDI не работает с Java EE Batch при реализации jberet - PullRequest
0 голосов
/ 17 апреля 2019

У меня есть пакетное приложение Java EE, реализованное с jberet, развернутым на сервере приложений WildFly.Это приложение также предоставляет API REST для запуска задания по требованию.

У меня есть следующий класс, создающий bean-компоненты для инъекции:

public class Factory {

    @Produces
    public JsonValidator getJsonValidator() {
        return JsonSchemaFactory.byDefault().getValidator();
}

Инъекция вышеупомянутого bean-компонента в API REST работает нормально:

@Path("my-resource")
public class MyResource{

    @Inject
    private JsonValidator jsonValidator;

    @PUT
    @Consumes(MediaType.APPLICATION_JSON)
    public Response handleNotification(String notification) {
        // using jsonValidator here works fine..

Однако использование того же компонента в ItemReader вызывает исключение нулевого указателя, однако внедрение JobContext работает без проблем:

public class MyReader extends AbstractItemReader {

    @Inject
    private JobContext jobContext;

    @Inject
    private JsonValidator jsonValidator;

    @Override
    public Integer readItem() throws Exception {
        // using jsonValidator here throws a null pointer exception
        // however jobContext works fine

Мой файл beans.xml в src / main / resources / META-INF:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://xmlns.jcp.org/xml/ns/javaee"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd"
       version="1.1" bean-discovery-mode="all">
</beans>

файл задания в src / main / resources / META-INF / batch-jobs / myjob.xml:

<job id="myjob" xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="1.0"> 
  <step id="mystep">
    <chunk item-count="1">
      <reader ref="myReader"/>
      <processor ref="myProcessor"/>
      <writer ref="myWriter"/>
    </chunk>
  </step>
</job>

файл пакетных артефактов в src / main /resources / META-INF / batch.xml

<?xml version="1.0" encoding="UTF-8"?>
<batch-artifacts xmlns="http://xmlns.jcp.org/xml/ns/javaee">
    <ref id="myReader" class="com.my.app.MyReader" />
    <ref id="myProcessor" class="com.my.app.MyProcessor" />
    <ref id="myWriter" class="com.my.app.MyWriter" />
</batch-artifacts>

Мой pom.xml выглядит следующим образом:

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.my.app</groupId>
    <artifactIdjava-batch</artifactId>
    <packaging>war</packaging>
    <version>1.0</version>

    <name>java-batch</name>
    <url>http://maven.apache.org</url>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>

        <!-- JBoss dependency versions -->
        <version.wildfly.maven.plugin>1.0.2.Final</version.wildfly.maven.plugin>

        <!-- other plugin versions -->
        <version.compiler.plugin>3.7.0</version.compiler.plugin>
        <version.surefire.plugin>2.21.0</version.surefire.plugin>
        <version.war.plugin>3.2.0</version.war.plugin>

        <!-- maven-compiler-plugin -->
        <maven.compiler.target>1.8</maven.compiler.target>
        <maven.compiler.source>1.8</maven.compiler.source>

        <version.org.jboss.spec.javax.batch.jboss-batch-api_1.0_spec>1.0.0.Final
        </version.org.jboss.spec.javax.batch.jboss-batch-api_1.0_spec>
        <version.org.jboss.spec.javax.ws.rs.jboss-jaxrs-api_2.0_spec>1.0.0.Final</version.org.jboss.spec.javax.ws.rs.jboss-jaxrs-api_2.0_spec>
        <version.org.jberet>1.3.0.Final</version.org.jberet>
        <version.javax.inject>1</version.javax.inject>
        <version.javax.enterprise>2.0</version.javax.enterprise>
    </properties>

    <build>
        <finalName>java-batch</finalName>
        <plugins>
            <plugin>
                <artifactId>maven-war-plugin</artifactId>
                <version>${version.war.plugin}</version>
            </plugin>
        </plugins>
    </build>

    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>org.jboss.spec.javax.batch</groupId>
                <artifactId>jboss-batch-api_1.0_spec</artifactId>
                <version>${version.org.jboss.spec.javax.batch.jboss-batch-api_1.0_spec}</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>javax.inject</groupId>
                <artifactId>javax.inject</artifactId>
                <version>${version.javax.inject}</version>
                <scope>provided</scope>
            </dependency>
            <dependency>
                <groupId>javax.enterprise</groupId>
                <artifactId>cdi-api</artifactId>
                <version>${version.javax.enterprise}</version>
                <scope>provided</scope>
            </dependency>

            <dependency>
                <groupId>org.jberet</groupId>
                <artifactId>jberet-rest-api</artifactId>
                <version>${version.org.jberet}</version>
                <scope>runtime</scope>
            </dependency>
            <dependency>
                <groupId>org.jberet</groupId>
                <artifactId>jberet-rest-commons</artifactId>
                <version>${version.org.jberet}</version>
                <scope>runtime</scope>
                <exclusions>
                    <exclusion>
                        <groupId>org.jberet</groupId>
                        <artifactId>jberet-core</artifactId>
                    </exclusion>
                </exclusions>
            </dependency>
            <dependency>
                <groupId>org.jberet</groupId>
                <artifactId>jberet-schedule-executor</artifactId>
                <version>${version.org.jberet}</version>
                <scope>runtime</scope>
            </dependency>
            <dependency>
                <groupId>org.jberet</groupId>
                <artifactId>jberet-schedule-timer</artifactId>
                <version>${version.org.jberet}</version>
                <scope>runtime</scope>
            </dependency>
            <dependency>
                <groupId>org.jberet</groupId>
                <artifactId>jberet-support</artifactId>
                <version>${version.org.jberet}</version>
                <scope>runtime</scope>
            </dependency>
            <dependency>
                <groupId>org.jboss.spec.javax.ws.rs</groupId>
                <artifactId>jboss-jaxrs-api_2.0_spec</artifactId>
                <version>${version.org.jboss.spec.javax.ws.rs.jboss-jaxrs-api_2.0_spec}</version>
            </dependency>
        </dependencies>
    </dependencyManagement>

    <dependencies>
        <dependency>
            <groupId>org.jboss.spec.javax.batch</groupId>
            <artifactId>jboss-batch-api_1.0_spec</artifactId>
        </dependency>
        <dependency>
            <groupId>javax.inject</groupId>
            <artifactId>javax.inject</artifactId>
        </dependency>
        <dependency>
            <groupId>javax.enterprise</groupId>
            <artifactId>cdi-api</artifactId>
        </dependency>

        <dependency>
            <groupId>org.jberet</groupId>
            <artifactId>jberet-rest-api</artifactId>
        </dependency>
        <dependency>
            <groupId>org.jberet</groupId>
            <artifactId>jberet-rest-commons</artifactId>
        </dependency>
        <dependency>
            <groupId>org.jberet</groupId>
            <artifactId>jberet-schedule-executor</artifactId>
        </dependency>
        <dependency>
            <groupId>org.jberet</groupId>
            <artifactId>jberet-schedule-timer</artifactId>
        </dependency>
        <dependency>
            <groupId>org.jberet</groupId>
            <artifactId>jberet-support</artifactId>
        </dependency>
        <dependency>
            <groupId>org.jberet</groupId>
            <artifactId>jberet-core</artifactId>
            <version>${version.org.jberet}</version>
        </dependency>
        <dependency>
            <groupId>org.jboss.spec.javax.ws.rs</groupId>
            <artifactId>jboss-jaxrs-api_2.0_spec</artifactId>
        </dependency>

        <dependency>
            <groupId>com.github.fge</groupId>
            <artifactId>json-schema-validator</artifactId>
            <version>2.2.6</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>LATEST</version>
            <scope>compile</scope>
        </dependency>

    </dependencies>
</project>

Я пробовал различные комбинации @Produce, @JobScoped (org.jberet.cdi.JobScoped) и добавление аннотированного класса с помощью @JobScoped, @Default и @ApplicationScoped, но все они дают одинаковый результат (NullPointerException при использовании внедренного объекта).

Чего мне не хватает?

1 Ответ

1 голос
/ 17 апреля 2019

Попробуйте добавить @Named в свои классы чтения, процессора и записи и удалить src / main / resources / META-INF / batch.xml. Это позволит CDI обнаруживать пакетные артефакты в виде компонентов CDI и выполнять внедрение зависимостей.

...