Skip to content
Snippets Groups Projects
Commit 60b8f70c authored by Lukas Malte Monnerjahn's avatar Lukas Malte Monnerjahn
Browse files

Move XtaZipRepresentationsMapper to Xta-Eingang

parent 27226803
No related branches found
No related tags found
No related merge requests found
Showing
with 65 additions and 101 deletions
package de.ozgcloud.eingang.semantik.common; package de.ozgcloud.eingang.common.zip;
public class ReadZipException extends RuntimeException { public class ReadZipException extends RuntimeException {
......
...@@ -21,11 +21,10 @@ ...@@ -21,11 +21,10 @@
* Die sprachspezifischen Genehmigungen und Beschränkungen * Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen. * unter der Lizenz sind dem Lizenztext zu entnehmen.
*/ */
package de.ozgcloud.eingang.semantik.common; package de.ozgcloud.eingang.common.zip;
import java.io.File; import java.io.File;
import java.io.FileInputStream; import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.io.IOException; import java.io.IOException;
import java.io.InputStream; import java.io.InputStream;
...@@ -43,7 +42,6 @@ import java.util.zip.ZipInputStream; ...@@ -43,7 +42,6 @@ import java.util.zip.ZipInputStream;
import org.springframework.util.MimeTypeUtils; import org.springframework.util.MimeTypeUtils;
import de.ozgcloud.eingang.common.errorhandling.TechnicalException; import de.ozgcloud.eingang.common.errorhandling.TechnicalException;
import de.ozgcloud.eingang.common.formdata.DeleteOnCloseInputStream;
import de.ozgcloud.eingang.common.formdata.IncomingFile; import de.ozgcloud.eingang.common.formdata.IncomingFile;
import lombok.Getter; import lombok.Getter;
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2;
...@@ -214,27 +212,10 @@ public class ZipAttachmentReader { ...@@ -214,27 +212,10 @@ public class ZipAttachmentReader {
.build(); .build();
} }
@Deprecated
public InputStream getSourceZipAsStream() {
try {
return new DeleteOnCloseInputStream(sourceZipFile);
} catch (FileNotFoundException e) {
throw new TechnicalException("Original ZIP was deleted", e);
}
}
public File getSourceZip() { public File getSourceZip() {
return sourceZipFile; return sourceZipFile;
} }
public long getSourceFileSize() {
try {
return Files.size(sourceZipFile.toPath());
} catch (IOException e) {
throw new TechnicalException("Cannot get size of source ZIP.", e);
}
}
String getContentType(String name) { String getContentType(String name) {
Objects.requireNonNull(name); Objects.requireNonNull(name);
return Objects.requireNonNullElse(URLConnection.guessContentTypeFromName(name), MimeTypeUtils.APPLICATION_OCTET_STREAM_VALUE); return Objects.requireNonNullElse(URLConnection.guessContentTypeFromName(name), MimeTypeUtils.APPLICATION_OCTET_STREAM_VALUE);
......
...@@ -21,7 +21,7 @@ ...@@ -21,7 +21,7 @@
* Die sprachspezifischen Genehmigungen und Beschränkungen * Die sprachspezifischen Genehmigungen und Beschränkungen
* unter der Lizenz sind dem Lizenztext zu entnehmen. * unter der Lizenz sind dem Lizenztext zu entnehmen.
*/ */
package de.ozgcloud.eingang.semantik.common; package de.ozgcloud.eingang.common.zip;
import static org.assertj.core.api.Assertions.*; import static org.assertj.core.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*;
...@@ -33,9 +33,11 @@ import java.nio.file.Files; ...@@ -33,9 +33,11 @@ import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.List; import java.util.List;
import java.util.function.Predicate; import java.util.function.Predicate;
import java.util.stream.Stream;
import java.util.zip.ZipException; import java.util.zip.ZipException;
import java.util.zip.ZipInputStream; import java.util.zip.ZipInputStream;
import de.ozgcloud.eingang.common.formdata.DeleteOnCloseInputStream;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Pair;
import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Assertions;
...@@ -47,8 +49,6 @@ import org.springframework.util.MimeTypeUtils; ...@@ -47,8 +49,6 @@ import org.springframework.util.MimeTypeUtils;
import de.ozgcloud.common.test.TestUtils; import de.ozgcloud.common.test.TestUtils;
import de.ozgcloud.eingang.common.formdata.IncomingFile; import de.ozgcloud.eingang.common.formdata.IncomingFile;
import de.ozgcloud.eingang.semantik.common.ReadZipException;
import de.ozgcloud.eingang.semantik.common.ZipAttachmentReader;
import lombok.SneakyThrows; import lombok.SneakyThrows;
class ZipAttachmentReaderTest { class ZipAttachmentReaderTest {
...@@ -75,20 +75,11 @@ class ZipAttachmentReaderTest { ...@@ -75,20 +75,11 @@ class ZipAttachmentReaderTest {
@SneakyThrows @SneakyThrows
private void verifySourceFileSavedInTmpDirectory() { private void verifySourceFileSavedInTmpDirectory() {
List<Path> foundFiles = Files.find(Path.of(getTmpDirectoryPath()), 1, try(Stream<Path> paths = Files.find(Path.of(getTmpDirectoryPath()), 1,
((path, basicFileAttributes) -> path.getFileName().toString().startsWith(ZipAttachmentReader.SOURCE_ZIP_PREFIX))) ((path, basicFileAttributes) -> path.getFileName().toString().startsWith(ZipAttachmentReader.SOURCE_ZIP_PREFIX)))) {
.toList(); List<Path> foundFiles = paths.toList();
assertThat(foundFiles).hasSize(1).first(); assertThat(foundFiles).hasSize(1);
} }
@Test
@DisplayName("should return readable input stream for source zip file")
void shouldReturnSourceStream() {
var expectedContent = TestUtils.loadFile(ZIP_1_FILE_NAME);
var sourceZipAsStream = createZipAttachment(ZIP_1_FILE_NAME).getSourceZipAsStream();
assertThat(sourceZipAsStream).hasSameContentAs(expectedContent);
} }
@Test @Test
...@@ -96,7 +87,7 @@ class ZipAttachmentReaderTest { ...@@ -96,7 +87,7 @@ class ZipAttachmentReaderTest {
void shouldFailSilentByEncryptedZip() { void shouldFailSilentByEncryptedZip() {
var zipAttachment = createZipAttachment(ZIP_ENCRYPTED); var zipAttachment = createZipAttachment(ZIP_ENCRYPTED);
assertThrows(ReadZipException.class, () -> zipAttachment.readContent()); assertThrows(ReadZipException.class, zipAttachment::readContent);
} }
private static ZipAttachmentReader createZipAttachment(String fileName) { private static ZipAttachmentReader createZipAttachment(String fileName) {
...@@ -137,7 +128,7 @@ class ZipAttachmentReaderTest { ...@@ -137,7 +128,7 @@ class ZipAttachmentReaderTest {
var attachmentContentList = new ZipAttachmentReader().readContent(loadZip(ZIP_1_FILE_NAME)); var attachmentContentList = new ZipAttachmentReader().readContent(loadZip(ZIP_1_FILE_NAME));
assertThat(attachmentContentList).hasSize(1); assertThat(attachmentContentList).hasSize(1);
var contentEntry = attachmentContentList.get(0); var contentEntry = attachmentContentList.getFirst();
assertThat(contentEntry.getName()).isEqualTo(content_file_0_name); assertThat(contentEntry.getName()).isEqualTo(content_file_0_name);
assertThat(contentEntry.getSize()).isEqualTo(content_file_0_size); assertThat(contentEntry.getSize()).isEqualTo(content_file_0_size);
assertThat(contentEntry.getContentStream()).hasSameContentAs(TestUtils.loadFile(content_file_0_name)); assertThat(contentEntry.getContentStream()).hasSameContentAs(TestUtils.loadFile(content_file_0_name));
...@@ -171,6 +162,7 @@ class ZipAttachmentReaderTest { ...@@ -171,6 +162,7 @@ class ZipAttachmentReaderTest {
entry.getContentStreamForFinalRead().close(); entry.getContentStreamForFinalRead().close();
} }
@SneakyThrows
@Test @Test
@DisplayName("should return readable input stream for source zip if cannot extract content") @DisplayName("should return readable input stream for source zip if cannot extract content")
void shouldReturnSourceStreamByError() { void shouldReturnSourceStreamByError() {
...@@ -179,7 +171,7 @@ class ZipAttachmentReaderTest { ...@@ -179,7 +171,7 @@ class ZipAttachmentReaderTest {
assertThrows(ReadZipException.class, attachment::readContent); assertThrows(ReadZipException.class, attachment::readContent);
assertThat(attachment.getSourceZipAsStream()).hasSameContentAs(new ByteArrayInputStream(attachmentContent)); assertThat(new DeleteOnCloseInputStream(attachment.getSourceZip())).hasSameContentAs(new ByteArrayInputStream(attachmentContent));
} }
@Test @Test
...@@ -189,7 +181,7 @@ class ZipAttachmentReaderTest { ...@@ -189,7 +181,7 @@ class ZipAttachmentReaderTest {
var zipAttachment = ZipAttachmentReader.from(invalidZip, "invalid"); var zipAttachment = ZipAttachmentReader.from(invalidZip, "invalid");
assertThrows(ReadZipException.class, () -> zipAttachment.readContent()); assertThrows(ReadZipException.class, zipAttachment::readContent);
} }
@Test @Test
...@@ -212,32 +204,37 @@ class ZipAttachmentReaderTest { ...@@ -212,32 +204,37 @@ class ZipAttachmentReaderTest {
private static final String ZIP_BOMB_WITH_MANY_FILES = "zipbombs/filewithmanyfiles.dat.zip"; private static final String ZIP_BOMB_WITH_MANY_FILES = "zipbombs/filewithmanyfiles.dat.zip";
@Test @Test
@SneakyThrows
void shouldFailOnExtremCompressionRatio() { void shouldFailOnExtremCompressionRatio() {
var zip = loadZip(ZIP_BOMB_WITH_BIG_NULL_FILE_CONTENT); try(var zip = loadZip(ZIP_BOMB_WITH_BIG_NULL_FILE_CONTENT)) {
ReadZipException exception = assertThrows(ReadZipException.class, () -> reader.readContent(zip)); ReadZipException exception = assertThrows(ReadZipException.class, () -> reader.readContent(zip));
assertThat(exception.getMessage()).contains("Ratio between compressed and uncompressed data is highly suspicious"); assertThat(exception.getMessage()).contains("Ratio between compressed and uncompressed data is highly suspicious");
} }
}
@Test @Test
@SneakyThrows @SneakyThrows
void shouldFailOnTotalExtractedSize() { void shouldFailOnTotalExtractedSize() {
var zip = loadZip(ZIP_1_FILE_NAME); try(var zip = loadZip(ZIP_1_FILE_NAME)) {
reader.readContent(zip); reader.readContent(zip);
verify(reader).checkTotalExtractedSize(157); verify(reader).checkTotalExtractedSize(157);
} }
}
@Test @Test
@SneakyThrows
void shouldFailOnTotalZipEntries() { void shouldFailOnTotalZipEntries() {
var zip = loadZip(ZIP_BOMB_WITH_MANY_FILES); try(var zip = loadZip(ZIP_BOMB_WITH_MANY_FILES)) {
ReadZipException exception = assertThrows(ReadZipException.class, () -> reader.readContent(zip)); ReadZipException exception = assertThrows(ReadZipException.class, () -> reader.readContent(zip));
assertThat(exception.getMessage()).contains("Total entries in zip file exceeded"); assertThat(exception.getMessage()).contains("Total entries in zip file exceeded");
} }
} }
}
@Nested @Nested
class TestSaveFiles { class TestSaveFiles {
...@@ -302,12 +299,16 @@ class ZipAttachmentReaderTest { ...@@ -302,12 +299,16 @@ class ZipAttachmentReaderTest {
@SneakyThrows @SneakyThrows
private static void cleanupTempFiles() { private static void cleanupTempFiles() {
Files.walk(Path.of(TMP_DIRECTORY_PATH), 1).filter(hasNameSuffix).map(Path::toFile).forEach(File::delete); try(Stream<Path> paths = Files.walk(Path.of(TMP_DIRECTORY_PATH), 1)) {
paths.filter(hasNameSuffix).map(Path::toFile).forEach(File::delete);
}
} }
@SneakyThrows @SneakyThrows
private static boolean noFilesWithSuffixInTempDirectory() { private static boolean noFilesWithSuffixInTempDirectory() {
return Files.walk(Path.of(TMP_DIRECTORY_PATH), 1).noneMatch(hasNameSuffix); try(Stream<Path> paths = Files.walk(Path.of(TMP_DIRECTORY_PATH), 1)) {
return paths.noneMatch(hasNameSuffix);
}
} }
@SneakyThrows @SneakyThrows
......
...@@ -33,7 +33,7 @@ import org.springframework.stereotype.Component; ...@@ -33,7 +33,7 @@ import org.springframework.stereotype.Component;
import de.ozgcloud.eingang.common.formdata.FormData; import de.ozgcloud.eingang.common.formdata.FormData;
import de.ozgcloud.eingang.common.formdata.IncomingFile; import de.ozgcloud.eingang.common.formdata.IncomingFile;
import de.ozgcloud.eingang.common.formdata.IncomingFileGroup; import de.ozgcloud.eingang.common.formdata.IncomingFileGroup;
import de.ozgcloud.eingang.semantik.common.ZipAttachmentReader; import de.ozgcloud.eingang.common.zip.ZipAttachmentReader;
import de.ozgcloud.eingang.semantik.enginebased.FilesMapperHelper; import de.ozgcloud.eingang.semantik.enginebased.FilesMapperHelper;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2;
......
package de.ozgcloud.eingang.semantik.enginebased.xta; package de.ozgcloud.eingang.semantik.enginebased.xta;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import de.ozgcloud.eingang.common.formdata.FormData; import de.ozgcloud.eingang.common.formdata.FormData;
import de.ozgcloud.eingang.semantik.enginebased.EngineBasedSemantikAdapter; import de.ozgcloud.eingang.semantik.enginebased.EngineBasedSemantikAdapter;
public class XtaEngineBasedAdapter implements EngineBasedSemantikAdapter { public class XtaEngineBasedAdapter implements EngineBasedSemantikAdapter {
@Autowired
private List<XtaEngineBasedMapper> mappers;
@Override @Override
public FormData parseFormData(FormData formData) { public FormData parseFormData(FormData formData) {
var processed = formData; return formData;
for (var mapper : mappers) {
processed = mapper.parseFormData(processed);
}
return processed;
} }
} }
package de.ozgcloud.eingang.semantik.enginebased.xta;
import de.ozgcloud.eingang.semantik.enginebased.EngineBasedMapper;
public interface XtaEngineBasedMapper extends EngineBasedMapper {
}
...@@ -95,6 +95,13 @@ ...@@ -95,6 +95,13 @@
<version>${mockwebserver.version}</version> <version>${mockwebserver.version}</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<!-- Test -->
<dependency>
<groupId>de.ozgcloud.eingang</groupId>
<artifactId>common</artifactId>
<type>test-jar</type>
<scope>test</scope>
</dependency>
</dependencies> </dependencies>
<build> <build>
......
package de.ozgcloud.eingang.xta; package de.ozgcloud.eingang.xta;
import org.springframework.beans.factory.annotation.Autowired; import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component; import org.springframework.stereotype.Component;
import org.springframework.ws.client.WebServiceClientException; import org.springframework.ws.client.WebServiceClientException;
import org.springframework.ws.client.support.interceptor.ClientInterceptor; import org.springframework.ws.client.support.interceptor.ClientInterceptor;
...@@ -8,7 +8,6 @@ import org.springframework.ws.context.MessageContext; ...@@ -8,7 +8,6 @@ import org.springframework.ws.context.MessageContext;
import org.springframework.ws.soap.SoapMessage; import org.springframework.ws.soap.SoapMessage;
import de.ozgcloud.eingang.common.errorhandling.TechnicalException; import de.ozgcloud.eingang.common.errorhandling.TechnicalException;
import eu.osci.ws._2014._10.transport.OriginatorsType;
import eu.osci.ws._2014._10.transport.PartyIdentifierType; import eu.osci.ws._2014._10.transport.PartyIdentifierType;
import eu.osci.ws._2014._10.transport.PartyType; import eu.osci.ws._2014._10.transport.PartyType;
import jakarta.validation.Valid; import jakarta.validation.Valid;
...@@ -17,11 +16,11 @@ import jakarta.xml.bind.JAXBElement; ...@@ -17,11 +16,11 @@ import jakarta.xml.bind.JAXBElement;
import jakarta.xml.bind.JAXBException; import jakarta.xml.bind.JAXBException;
@Component @Component
@RequiredArgsConstructor
class WsHeaderAddingInterceptor implements ClientInterceptor { class WsHeaderAddingInterceptor implements ClientInterceptor {
@Autowired
@Valid @Valid
private XtaProperties properties; private final XtaProperties properties;
@Override @Override
public boolean handleRequest(MessageContext messageContext) throws WebServiceClientException { public boolean handleRequest(MessageContext messageContext) throws WebServiceClientException {
...@@ -47,9 +46,6 @@ class WsHeaderAddingInterceptor implements ClientInterceptor { ...@@ -47,9 +46,6 @@ class WsHeaderAddingInterceptor implements ClientInterceptor {
identifier.setValue(properties.getIdentifier()); identifier.setValue(properties.getIdentifier());
partyType.setIdentifier(identifier); partyType.setIdentifier(identifier);
var origin = new OriginatorsType();
origin.setAuthor(partyType);
return objectFactory.createAuthor(partyType); return objectFactory.createAuthor(partyType);
} }
......
...@@ -9,7 +9,10 @@ import de.ozgcloud.eingang.common.formdata.FormData; ...@@ -9,7 +9,10 @@ import de.ozgcloud.eingang.common.formdata.FormData;
import de.ozgcloud.eingang.common.formdata.FormHeader; import de.ozgcloud.eingang.common.formdata.FormHeader;
import de.ozgcloud.eingang.common.formdata.IncomingFile; import de.ozgcloud.eingang.common.formdata.IncomingFile;
@Mapper @Mapper(
/*uses = XtaZipRepresentationsMapper.class,
injectionStrategy = InjectionStrategy.CONSTRUCTOR*/
)
interface XtaMessageMapper { interface XtaMessageMapper {
@Mapping(target = "antragsteller", ignore = true) @Mapping(target = "antragsteller", ignore = true)
......
...@@ -10,7 +10,6 @@ import java.util.Iterator; ...@@ -10,7 +10,6 @@ import java.util.Iterator;
import java.util.stream.Stream; import java.util.stream.Stream;
import javax.xml.namespace.QName; import javax.xml.namespace.QName;
import javax.xml.transform.TransformerException;
import org.apache.commons.io.IOUtils; import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
...@@ -104,19 +103,16 @@ class XtaRemoteService { ...@@ -104,19 +103,16 @@ class XtaRemoteService {
} }
WebServiceMessageCallback buildMarshalCallBack(Object jaxbElement, ActionCallback callback) { WebServiceMessageCallback buildMarshalCallBack(Object jaxbElement, ActionCallback callback) {
return new WebServiceMessageCallback() { return message -> {
@Override
public void doWithMessage(WebServiceMessage message) throws IOException, TransformerException {
MarshallingUtils.marshal(osciMarshaller, jaxbElement, message); MarshallingUtils.marshal(osciMarshaller, jaxbElement, message);
callback.doWithMessage(message); callback.doWithMessage(message);
}
}; };
} }
WebServiceMessageExtractor<MsgStatusListTypeAndHeaderResponse> buildHeaderExtractor() { WebServiceMessageExtractor<MsgStatusListTypeAndHeaderResponse> buildHeaderExtractor() {
return new WebServiceMessageExtractor<MsgStatusListTypeAndHeaderResponse>() { return new WebServiceMessageExtractor<>() {
@Override @Override
public MsgStatusListTypeAndHeaderResponse extractData(WebServiceMessage message) throws IOException, TransformerException { public MsgStatusListTypeAndHeaderResponse extractData(WebServiceMessage message) throws IOException {
MsgBoxResponseType header = extractHeader(message); MsgBoxResponseType header = extractHeader(message);
...@@ -277,7 +273,7 @@ class XtaRemoteService { ...@@ -277,7 +273,7 @@ class XtaRemoteService {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
ExceptionType exceptionType = ((JAXBElement<ExceptionType>) xoevMarshaller.unmarshal(soapfaultdetailelement1.getSource())).getValue(); ExceptionType exceptionType = ((JAXBElement<ExceptionType>) xoevMarshaller.unmarshal(soapfaultdetailelement1.getSource())).getValue();
return DETAIL_LOG_TEMPLATE.formatted(exceptionType.getErrorCode().getCode(), exceptionType.getErrorCode().getName().toString()); return DETAIL_LOG_TEMPLATE.formatted(exceptionType.getErrorCode().getCode(), exceptionType.getErrorCode().getName());
} }
......
...@@ -11,7 +11,7 @@ import java.security.cert.CertificateException; ...@@ -11,7 +11,7 @@ import java.security.cert.CertificateException;
import javax.net.ssl.KeyManagerFactory; import javax.net.ssl.KeyManagerFactory;
import org.springframework.beans.factory.annotation.Autowired; import lombok.RequiredArgsConstructor;
import org.springframework.boot.webservices.client.WebServiceTemplateCustomizer; import org.springframework.boot.webservices.client.WebServiceTemplateCustomizer;
import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Configuration;
...@@ -28,12 +28,12 @@ import lombok.extern.log4j.Log4j2; ...@@ -28,12 +28,12 @@ import lombok.extern.log4j.Log4j2;
@Log4j2 @Log4j2
@Configuration @Configuration
@RequiredArgsConstructor
public class XtaRemoteServiceConfiguration { public class XtaRemoteServiceConfiguration {
static final String URI_TEMPLATE = "%s://%s/MB_XTA-WS/XTA210msgBoxPort.svc"; static final String URI_TEMPLATE = "%s://%s/MB_XTA-WS/XTA210msgBoxPort.svc";
@Autowired private final XtaProperties properties;
private XtaProperties properties;
@Bean @Bean
Jaxb2Marshaller osciTransportMarshaller() { Jaxb2Marshaller osciTransportMarshaller() {
......
package de.ozgcloud.eingang.xta; package de.ozgcloud.eingang.xta;
import org.springframework.beans.factory.annotation.Autowired; import lombok.RequiredArgsConstructor;
import org.springframework.context.ApplicationListener; import org.springframework.context.ApplicationListener;
import org.springframework.context.annotation.Profile; import org.springframework.context.annotation.Profile;
import org.springframework.context.event.ContextRefreshedEvent; import org.springframework.context.event.ContextRefreshedEvent;
...@@ -11,15 +11,15 @@ import de.ozgcloud.eingang.semantik.SemantikAdapter; ...@@ -11,15 +11,15 @@ import de.ozgcloud.eingang.semantik.SemantikAdapter;
import lombok.NonNull; import lombok.NonNull;
import lombok.extern.log4j.Log4j2; import lombok.extern.log4j.Log4j2;
@Profile("!itcase") @Profile("!itcase")
@Log4j2 @Log4j2
@Component @Component
@RequiredArgsConstructor
class XtaRunner implements ApplicationListener<ContextRefreshedEvent> { class XtaRunner implements ApplicationListener<ContextRefreshedEvent> {
@Autowired private final XtaService service;
private XtaService service; private final SemantikAdapter semantikAdapter;
@Autowired
private SemantikAdapter semantikAdapter;
@Override @Override
public void onApplicationEvent(ContextRefreshedEvent event) { public void onApplicationEvent(ContextRefreshedEvent event) {
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment