Я хочу загружать и обрабатывать файлы схемы json из двух разных развертываний, первое из которых - WAR с конечной точкой JAX-RS, а второе - EAR с Singleton- EJB + ресурсы JAR , содержащие файлы схемы (я читал, что упаковка файлов ресурсов для использования в EJB возможна только при объединении их в отдельный JAR внутри EAR).
Средой разработки является затмение 2019-03 с JBoss Wildfly 16.
Развертывание WAR с конечной точкой JAX-RS
С частью WAR все в порядке, у меня есть @ApplicationScoped
Bean и я могу получить доступфайлы схемы, расположенные в src/main/webapp/schemas/
через ServletContext, см. следующий фрагмент кода:
@ForWarDeployment
@ApplicationScoped
public class JsonSchemaValidatorWar extends JsonSchemaValidatorBase {
...
@PostConstruct
public void init() {
Consumer<Path> readSchema = schemaFile -> {
String schemaName = schemaFile.getName(schemaFile.getNameCount() - 1).toString();
JsonSchema js = jvs.readSchema(schemaFile);
map.put(schemaName, js); // this is a concurrent hash map in base class
log.info("Schema " + schemaName + " added: " + js.toJson());
};
URI schemaFolder;
try {
schemaFolder = servletContext.getResource("/schemas").toURI();
try (Stream<Path> paths = Files.walk(Paths.get(schemaFolder))) {
paths.filter(Files::isRegularFile).forEach(readSchema);
}
} catch (URISyntaxException | IOException e) {
throw new RuntimeException("Error loading schema files!", e);
}
}
Вывод по первому запросу:
... (задание по умолчанию-1) Схемаperson.schema.json добавил: {"$ id": ...
Развертывание EAR с EJB и ресурсами JAR
Часть EJB сложная, я не нашелрешение для чтения всех файлов схемы.
Что у меня сейчас естьe - это многомодульный проект maven со следующей структурой:
- parent
- | ear
- | ejb3
- | resources
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>mdv</groupId>
<artifactId>json-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>pom</packaging>
<modules>
<module>json-ejb3</module>
<module>json-ear</module>
<module>json-resources</module>
</modules>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
</project>
pom.xml для ear-проекта
<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>
<parent>
<groupId>mdv</groupId>
<artifactId>json-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>json-ear</artifactId>
<packaging>ear</packaging>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<dependencies>
<dependency>
<groupId>mdv</groupId>
<artifactId>json-ejb3</artifactId>
<version>${project.version}</version>
<type>ejb</type>
</dependency>
<dependency>
<groupId>mdv</groupId>
<artifactId>json-resources</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-ear-plugin</artifactId>
<version>3.0.1</version>
<configuration>
<version>7</version>
<defaultLibBundleDir>lib</defaultLibBundleDir>
<earSourceDirectory>${basedir}/src/main/resources</earSourceDirectory>
<outputFileNameMapping>@{artifactId}@@{dashClassifier?}@.@{extension}@</outputFileNameMapping>
</configuration>
</plugin>
</plugins>
</build>
</project>
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>
<parent>
<groupId>mdv</groupId>
<artifactId>json-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>json-resources</artifactId>
</project>
pom.xml для проекта ejb3
<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>
<parent>
<groupId>mdv</groupId>
<artifactId>json-parent</artifactId>
<version>0.0.1-SNAPSHOT</version>
</parent>
<artifactId>json-ejb3</artifactId>
<packaging>ejb</packaging>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
</properties>
<build>
<finalName>${project.artifactId}</finalName>
<plugins>
<plugin>
<artifactId>maven-ejb-plugin</artifactId>
<version>3.0.1</version>
<configuration>
<ejbVersion>3.2</ejbVersion>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<!-- contains a json schema processing library and the class JsonSchemaValidatorEjb -->
<groupId>mdv</groupId>
<artifactId>json</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
Проблема с загрузкой файлов схемы в EJB
Я хочу загрузитьфайлы схемы в bean-компоненте @ApplicationScoped
для использования в Singleton EJB, соответствующий класс: JsonSchemaValidatorService
:
package mdv;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.ejb.Singleton;
import javax.ejb.Startup;
import javax.inject.Inject;
import json.ForEjbDeployment;
import json.IJsonSchemaValidator;
@Singleton
@Startup
public class JsonSchemaValidatorService {
Logger log = Logger.getLogger("JsonSchemaValidatorService");
@Inject
@ForEjbDeployment
IJsonSchemaValidator jsonSchemaValidator;
// this is where json schema files should be loaded
public JsonSchemaValidatorService() {
//
}
@PostConstruct
public void init() {
log.info("Started JsonSchemaValidatorService.");
log.info("Loaded schemas in jsonSchemaValidator: " + jsonSchemaValidator.getLoadedSchemas());
}
}
класс для загрузки файлов схемы json в среде EJB: bean:
package json;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.net.URISyntaxException;
import java.nio.charset.StandardCharsets;
import java.nio.file.Path;
import java.util.function.Consumer;
import java.util.logging.Logger;
import javax.annotation.PostConstruct;
import javax.enterprise.context.ApplicationScoped;
import javax.resource.spi.IllegalStateException;
import org.leadpony.justify.api.JsonSchema;
@ForEjbDeployment
@ApplicationScoped
public class JsonSchemaValidatorEjb extends JsonSchemaValidatorBase {
Logger log = Logger.getLogger("JsonSchemaValidator");
public JsonSchemaValidatorEjb() {
//
}
@PostConstruct
public void init() {
try {
// This is where I can't manage to get a list of the json schema files and process them
final ClassLoader loader = Thread.currentThread().getContextClassLoader();
try(
final InputStream is = loader.getResourceAsStream("schemas");
final InputStreamReader isr = new InputStreamReader(is, StandardCharsets.UTF_8);
final BufferedReader br = new BufferedReader(isr)) {
log.info("schema files in directory: ");
br.lines().forEach(x -> log.info(x));
}
} catch (Exception e) {
throw new RuntimeException("Error trying to parse schema files!", e);
}
}
}
Исключение не выдается, но в указанном каталоге также не найдены файлы, например, "схемы".Сокращенный вывод после запуска EJB:
[JsonSchemaValidatorService] Started JsonSchemaValidatorService.
[JsonSchemaValidator] schema files in directory:
[JsonSchemaValidatorService] Loaded schemas in jsonSchemaValidator: {}
Структура файла развернутого уха такова:
- lib
| - icu4j.jar
| - javax.json-api.jar
| - javax.json.jar
| - json-resources.jar // jar with resources, in this case the schemas
| | - schemas
| | | - person.schema.json
| - json.jar // jar containing @ApplicationScoped beans for war und ejb
| - justify.jar // json schema processing library used
- META-INF
| - maven
| | ...
| - schemas
| | - person.schema.json
| - application.xml
| - MANIFEST.MF
- schemas
| -person.schema.json
- json-ejb3.jar
Как видите, мне удалось связать папку schemas
и один файл схемы JSON в нескольких местах, но ничего из этого не работает.
Достигается ли это вообще?Я не прав с путем, указанным в getResourceAsStream("schemas")
?
Цель состоит в том, чтобы загрузить все существующие файлы схемы json при запуске, чтобы один раз проанализировать их для объектов JsonSchema, чтобы впоследствии проверить их (это будет управляемое сообщениями).боб, кстати).