Skip to content
Snippets Groups Projects
Commit 0b1d3ea8 authored by OZGCloud's avatar OZGCloud
Browse files

OZG-3136 enable XTA getStatusListRequest

parent 5f06bbfa
Branches
Tags
No related merge requests found
Showing
with 639 additions and 835 deletions
......@@ -27,7 +27,7 @@ import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.scheduling.annotation.EnableScheduling;
@SpringBootApplication(scanBasePackages = "de.itvsh.kop")
@SpringBootApplication(scanBasePackages = { "de.itvsh.kop", "de.ozgcloud" })
@EnableScheduling
public class Application {
......
{"properties": [{
"name": "ozgcloud.xta.actions.status-list",
"type": "java.lang.String",
"description": "A description for 'ozgcloud.xta.actions.status-list'"
}]}
\ No newline at end of file
......@@ -3,7 +3,7 @@
<parent>
<groupId>de.itvsh.kop.eingangsadapter</groupId>
<artifactId>parent</artifactId>
<version>1.6.0</version>
<version>1.7.0-SNAPSHOT</version>
</parent>
<artifactId>xta-adapter</artifactId>
<name>Eingangs Adapter - XTA</name>
......@@ -19,32 +19,42 @@
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-ws-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-log4j2</artifactId>
</dependency>
<!--mapstruct-->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-ws-core</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.ws</groupId>
<artifactId>spring-ws-support</artifactId>
</dependency>
<!--own project -->
<dependency>
<groupId>de.itvsh.kop.eingangsadapter</groupId>
<artifactId>common</artifactId>
</dependency>
<!-- JAXB API only -->
<dependency>
<groupId>jakarta.xml.bind</groupId>
<artifactId>jakarta.xml.bind-api</artifactId>
<version>2.3.3</version>
<!-- <version>2.3.3</version>-->
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId> <version>2.3.3</version>
<artifactId>jaxb-impl</artifactId>
<!-- <version>2.3.3</version>-->
</dependency>
<!-- https://mvnrepository.com/artifact/javax.xml.ws/jaxws-api -->
<!--<dependency>-->
......@@ -52,10 +62,33 @@
<!-- <artifactId>jaxws-impl</artifactId>-->
<!-- <version>2.3.1</version>-->
<!--</dependency>-->
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-failsafe-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
</plugin>
<plugin>
<groupId>org.jacoco</groupId>
<artifactId>jacoco-maven-plugin</artifactId>
</plugin>
<plugin>
<groupId>pl.project13.maven</groupId>
<artifactId>git-commit-id-plugin</artifactId>
</plugin>
<!-- <plugin>-->
<!-- <groupId>com.evolvedbinary.maven.jvnet</groupId>-->
<!-- <artifactId>jaxb30-maven-plugin</artifactId>-->
......
# Ceritifcade chain
lokal das Root CA in keystore laden:
sudo keytool -trustcacerts -keystore /lib/jvm/java-1.17.0-openjdk-amd64/lib/security/cacerts -storepass changeit -importcert -alias dataportRoot -file DataportRootCA02.crt
\ No newline at end of file
package de.ozgcloud.eingang.xta;
import jakarta.xml.bind.JAXBContext;
import jakarta.xml.bind.JAXBElement;
import jakarta.xml.bind.JAXBException;
import org.springframework.stereotype.Component;
import org.springframework.ws.client.WebServiceClientException;
import org.springframework.ws.client.support.interceptor.ClientInterceptor;
import org.springframework.ws.context.MessageContext;
import org.springframework.ws.soap.SoapMessage;
import de.itvsh.kop.eingangsadapter.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.PartyType;
@Component
class WsHeaderAddingInterceptor implements ClientInterceptor {
@Override
public boolean handleRequest(MessageContext messageContext) throws WebServiceClientException {
var soapMessage = (SoapMessage) messageContext.getRequest();
var header = soapMessage.getSoapHeader();
try {
JAXBContext context = JAXBContext.newInstance(PartyType.class);
var marshaller = context.createMarshaller();
marshaller.marshal(createAuthor(), header.getResult());
} catch (JAXBException e) {
throw new TechnicalException("Error on handling Request for adding Header.", e);
}
return true;
}
JAXBElement<PartyType> createAuthor() {
eu.osci.ws._2014._10.transport.ObjectFactory objectFactory = new eu.osci.ws._2014._10.transport.ObjectFactory();
PartyType partyType = new PartyType();
PartyIdentifierType identifier = new PartyIdentifierType();
identifier.setValue("gae:jens.reese@mgm-tp.com");
partyType.setIdentifier(identifier);
var origin = new OriginatorsType();
origin.setAuthor(partyType);
return objectFactory.createAuthor(partyType);
}
@Override
public boolean handleResponse(MessageContext messageContext) throws WebServiceClientException {
return true;
}
@Override
public boolean handleFault(MessageContext messageContext) throws WebServiceClientException {
return true;
}
@Override
public void afterCompletion(MessageContext messageContext, Exception ex) throws WebServiceClientException {
// nothing to do here
}
}
package de.ozgcloud.eingang.xta;
import java.math.BigInteger;
import java.net.URI;
import jakarta.validation.constraints.NotEmpty;
import jakarta.validation.constraints.NotNull;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.stereotype.Component;
import org.springframework.validation.annotation.Validated;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
@Validated
@ToString
@Setter
@Getter
@Configuration
@ConfigurationProperties(prefix = XtaProperties.PROPERTIES_PREFIX)
class XtaProperties {
static final String PROPERTIES_PREFIX = "ozgcloud.xta";
private Server server;
private BigInteger maxListElements;
private KeyStore keyStore;
private Actions actions;
}
@Validated
@ToString
@Getter
@Setter
@Component
@ConfigurationProperties(prefix = Server.PROPERTIES_PREFIX)
class Server {
static final String PROPERTIES_PREFIX = XtaProperties.PROPERTIES_PREFIX + ".server";
@NotEmpty
private String name;
private String address;
}
@Validated
@ToString
@Getter
@Setter
@Component
@ConfigurationProperties(prefix = KeyStore.PROPERTIES_PREFIX)
class KeyStore {
static final String PROPERTIES_PREFIX = XtaProperties.PROPERTIES_PREFIX + ".keystore";
@NotNull
private Resource file;
private String type = "PKCS12";
@NotEmpty
private char[] password;
}
@Validated
@ToString
@Setter
@Getter
@Configuration
@ConfigurationProperties(prefix = Actions.PROPERTIES_PREFIX)
class Actions {
static final String PROPERTIES_PREFIX = XtaProperties.PROPERTIES_PREFIX + ".actions";
@NotNull
private URI statusList;
}
package de.ozgcloud.eingang.xta;
import java.math.BigInteger;
import java.net.URI;
import java.net.URISyntaxException;
import javax.xml.bind.JAXBElement;
import jakarta.annotation.PostConstruct;
import jakarta.validation.Valid;
import jakarta.xml.bind.JAXBElement;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.webservices.client.WebServiceTemplateBuilder;
import org.springframework.stereotype.Service;
import org.springframework.ws.client.core.support.WebServiceGatewaySupport;
import org.springframework.ws.client.core.WebServiceTemplate;
import org.springframework.ws.soap.addressing.client.ActionCallback;
import org.springframework.ws.soap.addressing.core.EndpointReference;
import org.springframework.ws.soap.addressing.version.Addressing10;
import de.itvsh.kop.eingangsadapter.common.errorhandling.TechnicalException;
import eu.osci.ws._2008._05.transport.MsgBoxStatusListRequestType;
import eu.osci.ws._2008._05.transport.MsgStatusListType;
import eu.osci.ws._2008._05.transport.ObjectFactory;
import lombok.extern.java.Log;
@Service
@Log
class XtaRemoteService extends WebServiceGatewaySupport {
class XtaRemoteService {
// @Autowired
// private XtaMessageMetaDataMapper mapper;
private static final String URI_TEMPLATE = "https://%s/MB_XTA-WS/XTA210msgBoxPort.svc";
// public Stream<XtaMessageMetaData> getMessagesMetadata() {
// return getStatusList().getMessageMetaData().stream().map(mapper::fromSoap);
// // TODO load more message with getNextStatusList
// }
@Autowired
@Valid
private XtaProperties properties;
MsgStatusListType getStatusList() throws URISyntaxException {
@Autowired
private WebServiceTemplateBuilder webServiceTemplateBuilder;
ObjectFactory objectFactory = new ObjectFactory();
//
MsgBoxStatusListRequestType msg = new MsgBoxStatusListRequestType();
msg.setMaxListItems(BigInteger.valueOf(5));
JAXBElement<MsgBoxStatusListRequestType> getStatusList = objectFactory.createMsgBoxStatusListRequest(msg);
//
// getWebServiceTemplate()
// .marshalSendAndReceive(objectFactory.createSendBspNachrichtNative(sendBspNachrichtNative)))
// .getValue();
private WebServiceTemplate template;
@PostConstruct
void init() {
template = webServiceTemplateBuilder.build();
}
// LOG.
@SuppressWarnings("unchecked")
MsgStatusListType getStatusList() {
var callback = new ActionCallback(properties.getActions().getStatusList(), new Addressing10(), getTargetUri());
var callback = new ActionCallback(new URI("http://LI33-0005/MB_XTA-WS/XTA210msgBoxPort.svc"));
callback.setReplyTo(new EndpointReference(new URI("https://localhost:3000/MB_XTA-WS/XTA210msgBoxPort.svc")));
return ((JAXBElement<MsgStatusListType>) template.marshalSendAndReceive(buildListRequest(), callback)).getValue();
}
return ((JAXBElement<MsgStatusListType>) getWebServiceTemplate().marshalSendAndReceive(
"https://localhost:3000/MB_XTA-WS/XTA210msgBoxPort.svc",
getStatusList, callback)).getValue();
private JAXBElement<MsgBoxStatusListRequestType> buildListRequest() {
ObjectFactory objectFactory = new ObjectFactory();
MsgBoxStatusListRequestType msg = new MsgBoxStatusListRequestType();
msg.setMaxListItems(properties.getMaxListElements());
return objectFactory.createMsgBoxStatusListRequest(msg);
}
private URI getTargetUri() {
try {
return new URI(URI_TEMPLATE.formatted(properties.getServer().getName()));
} catch (URISyntaxException e) {
throw new TechnicalException("Error building target url: " + e);
}
}
public XtaMessage getMessage(XtaMessageId messageId) {
......
......@@ -2,10 +2,11 @@ package de.ozgcloud.eingang.xta;
import java.io.IOException;
import java.io.InputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
......@@ -15,47 +16,92 @@ import javax.net.ssl.SSLSession;
import javax.net.ssl.TrustManager;
import javax.net.ssl.X509TrustManager;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.webservices.client.WebServiceTemplateCustomizer;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.oxm.jaxb.Jaxb2Marshaller;
import org.springframework.ws.client.support.destination.DestinationProvider;
import org.springframework.ws.client.support.interceptor.ClientInterceptor;
import org.springframework.ws.soap.SoapVersion;
import org.springframework.ws.soap.saaj.SaajSoapMessageFactory;
import org.springframework.ws.transport.WebServiceMessageSender;
import org.springframework.ws.transport.http.HttpsUrlConnectionMessageSender;
import de.itvsh.kop.eingangsadapter.common.errorhandling.TechnicalException;
@Configuration
public class XtaRemoteServiceConfiguration {
private static final String KEYSTORE_TYPE = "PKCS12";
@Value("classpath:KOP_SH_KIEL_DEV.p12")
private Resource certificate;
private String certificateKey = "";
@Autowired
private XtaProperties properties;
@Bean
public Jaxb2Marshaller marshaller() {
Jaxb2Marshaller marshaller() {
Jaxb2Marshaller marshaller = new Jaxb2Marshaller();
marshaller.setContextPath("eu.osci.ws._2008._05.transport");
marshaller.setMtomEnabled(true);
return marshaller;
}
@Bean
public XtaRemoteService xtaRemoteService(Jaxb2Marshaller marshaller)
throws UnrecoverableKeyException, KeyStoreException, CertificateException, NoSuchAlgorithmException, IOException {
XtaRemoteService client = new XtaRemoteService();
client.setDefaultUri("https://localhost:3000/MB_XTA-WS/XTA210msgBoxPort.svc");
marshaller.setMtomEnabled(true);
client.setMarshaller(marshaller);
client.setUnmarshaller(marshaller);
WebServiceTemplateCustomizer webServiceTemplateCustomizer() {
return template -> template
.setMessageSender(messageSender());
}
@Bean
WebServiceTemplateCustomizer setMarshallerCustomizer() {
return template -> {
template.setMarshaller(marshaller());
template.setUnmarshaller(marshaller());
};
}
client.setMessageSender(initMessageSender());
return client;
@Bean
WebServiceTemplateCustomizer setMessageFactoryCustomizer() {
return template -> template.setMessageFactory(messageFactory());
}
HttpsUrlConnectionMessageSender initMessageSender()
throws KeyStoreException, CertificateException, NoSuchAlgorithmException, IOException, UnrecoverableKeyException {
@Bean
WebServiceTemplateCustomizer addingInterceptorCustomizer(WsHeaderAddingInterceptor interceptor) {
return template -> template.setInterceptors(new ClientInterceptor[] { interceptor });
}
@Bean
WebServiceTemplateCustomizer setDestionationProvider() {
return template -> template.setDestinationProvider(destinationProvider());
}
@Bean
DestinationProvider destinationProvider() {
return () -> {
try {
return new URI("https://localhost:3000/MB_XTA-WS/XTA210msgBoxPort.svc");
} catch (URISyntaxException e) {
throw new TechnicalException("Error building URI", e);
}
};
}
@Bean
SaajSoapMessageFactory messageFactory() {
SaajSoapMessageFactory messageFactory = new SaajSoapMessageFactory();
messageFactory.setSoapVersion(SoapVersion.SOAP_12);
return messageFactory;
}
@Bean
WebServiceMessageSender messageSender() {
return initMessageSender();
}
HttpsUrlConnectionMessageSender initMessageSender() {
try {
var keyManagerFactory = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
keyManagerFactory.init(getKeyStore(), certificateKey.toCharArray());
keyManagerFactory.init(xtaKeyStore(), properties.getKeyStore().getPassword());
var messageSender = new HttpsUrlConnectionMessageSender();
messageSender.setKeyManagers(keyManagerFactory.getKeyManagers());
......@@ -68,16 +114,20 @@ public class XtaRemoteServiceConfiguration {
}
});
return messageSender;
} catch (Exception e) {
throw new TechnicalException("Error initializating message sender.", e);
}
}
KeyStore getKeyStore() throws KeyStoreException, CertificateException, NoSuchAlgorithmException, IOException {
var keyStoreResource = certificate;
@Bean
KeyStore xtaKeyStore() throws KeyStoreException, CertificateException, NoSuchAlgorithmException, IOException {
var keyStoreResource = properties.getKeyStore().getFile();
// var keysres = XtaRemoteServiceConfiguration.class.getResourceAsStream("/KOP_SH_KIEL_DEV.p12");
// assert (keysres != null);
var keyStore = KeyStore.getInstance(KEYSTORE_TYPE);
try (InputStream keyStoreStream = keyStoreResource.getInputStream()) {
// try (InputStream keyStoreStream = keysres) {
keyStore.load(keyStoreStream, certificateKey.toCharArray());
keyStore.load(keyStoreStream, properties.getKeyStore().getPassword());
}
return keyStore;
......
This diff is collapsed.
logging.level.org.springframework.web=DEBUG
logging.level.org.springframework.ws.client.MessageTracing.sent=DEBUG
logging.level.org.springframework.ws.server.MessageTracing.sent=DEBUG
logging.level.org.springframework.ws.client.MessageTracing.received=TRACE
logging.level.org.springframework.ws.server.MessageTracing.received=TRACE
log4j.logger.org.springframework.ws.client.MessageTracing.sent=TRACE
log4j.logger.org.springframework.ws.client.MessageTracing.received=TRACE
log4j.logger.org.springframework.ws.client.MessageTracing.sent=DEBUG
log4j.logger.org.springframework.ws.client.MessageTracing.received=TRACE
log4j.logger.org.springframework.ws.server.MessageTracing.sent=DEBUG
log4j.logger.org.springframework.ws.server.MessageTracing.received=TRACE
log4j.logger.org.springframework.ws.server.MessageTracing=DEBUG
log4j.logger.org.springframework.ws.client.MessageTracing=TRACE
logging.level.org.springframework.ws=TRACE
org.springframework.ws.server.MessageTracing=TRACE
org.springframework.ws.server.MessageTracing.sent=TRACE
org.springframework.ws.client.MessageTracing.received=TRACE
spring:
profiles:
active:
- sec
logging:
level:
ROOT: WARN
'[de.ozgcloud]': INFO
'[org.springframework.ws]': TRACE
config: classpath:log4j2-local.xml
ozgcloud:
xta:
max-list-elements: 10
server:
name: LI33-0005
address: localhost:3000
keystore:
file: classpath:KOP_SH_KIEL_DEV.p12
type: PKCS12
actions:
status-list: "http://www.osci.eu/ws/2008/05/transport/urn/messageTypes/MsgBoxStatusListRequest"
\ No newline at end of file
log4j.rootCategory=INFO, stdout
log4j.logger.org.springframework.ws.client.MessageTracing.sent=TRACE
log4j.logger.org.springframework.ws.client.MessageTracing.received=TRACE
log4j.logger.org.springframework.ws.server.MessageTracing=TRACE
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%p [%c{3}] %m%n
\ No newline at end of file
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<include resource="org/springframework/boot/logging/logback/base.xml"/>
<logger name="org.springframework.web" level="INFO"/>
<logger name="org.springframework.ws.client.MessageTracing.sent" level="TRACE"/>
<logger name="org.springframework.ws.client.MessageTracing.received" level="TRACE"/>
<logger name="org.springframework.ws.server.MessageTracing" level="TRACE"/>
</configuration>
\ No newline at end of file
......@@ -7,7 +7,7 @@ This document and translations of it may be copied and furnished to others, and
The limited permissions granted above are perpetual and will not be revoked by OASIS or its successors or assigns.
This document and the information contained herein is provided on an “AS IS” basis and OASIS DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
-->
<xsd:schema targetNamespace="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" elementFormDefault="qualified" attributeFormDefault="unqualified" blockDefault="#all" version="0.2">
<xsd:schema targetNamespace="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:SOAP-ENV="http://www.w3.org/2003/05/soap-envelope" xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" elementFormDefault="qualified" attributeFormDefault="unqualified" blockDefault="#all" version="0.2">
<xsd:import namespace="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" schemaLocation="oasis-200401-wss-wssecurity-utility-1.0.xsd"/>
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" schemaLocation="xml.xsd"/>
<xsd:import namespace="http://www.w3.org/2000/09/xmldsig#" schemaLocation="xmldsig-core-schema.xsd"/>
......
......@@ -4,25 +4,39 @@ import static org.assertj.core.api.Assertions.*;
import java.net.URISyntaxException;
import jakarta.validation.Valid;
import org.junit.jupiter.api.Nested;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.support.AnnotationConfigContextLoader;
import org.springframework.test.context.ActiveProfiles;
import de.itvsh.kop.eingangsadapter.Application;
import eu.osci.ws._2008._05.transport.MsgStatusListType;
@SpringBootTest
@ContextConfiguration(classes = XtaRemoteServiceConfiguration.class, loader = AnnotationConfigContextLoader.class)
public class XtaRemoteServiceLiveTest {
@ActiveProfiles({ "itcase", "local", "sec" })
@SpringBootTest(classes = Application.class)
class XtaRemoteServiceITCase {
@Autowired
XtaRemoteService xtaRemoteService;
private XtaRemoteService xtaRemoteService;
@Autowired
@Valid
private XtaProperties xtaProperties;
@Nested
class TestProperties {
@Test
void test() throws URISyntaxException {
void shouldHaveStatusListAction() {
assertThat(xtaProperties.getActions().getStatusList()).isNotNull();
}
}
@Test
void test() throws URISyntaxException {
MsgStatusListType rsp = xtaRemoteService.getStatusList();
assertThat(rsp.getMessageMetaData()).isNotEmpty();
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment