Citrus Simulator генерирует исключение Nullpointer при получении сериализованных данных XML - PullRequest
0 голосов
/ 20 сентября 2019

Я использую Citrus Simulator в качестве приложения с начальной загрузкой для имитации веб-служб, отвечающих на вызовы HTTP POST.Все отлично работает в "лабораторных" условиях.Пока я отправляю данные вручную через Postman, curl или плагин для браузера, у меня нет проблем и четких ответов.Однако как только данные отправляются другим приложением, я получаю неприятное исключение нулевого указателя.

Мне потребовалось некоторое время, чтобы точно определить проблему, но теперь я знаю, что это формат отправленных данных.

Отправка симпатичных печатных XML-данных приводит к идеальному ответу.Однако, как только я сериализирую xml, Citrus Simulator не будет правильно обрабатывать его, и я получу исключение nullpointer .

Используя curl, я также могу спровоцировать ошибку простоуничтожение формата отправленного XML-файла.

Редактировать Это не формат напрямую.Оба приложения при отправке данных в довольно печатном формате генерируют метаданные заголовка HTTP с некоторым (странным) содержимым -> curl отправляет метаданные = "\ t \ t \ t", почтальон отправляет метаданные = "\ n".Отправляя сериализованный xml, оба приложения отправляют пустой заголовок метаданных, что приводит к исключению нулевого указателя прямо здесь (MessageService.java:60) -> StringUtils.abbreviate(headerEntry.getValue().toString(), 255))));

java.lang.NullPointerException: null
at com.consol.citrus.simulator.service.MessageService.lambda$saveMessage$0(MessageService.java:60) ~[citrus-simulator-starter-1.0.3.jar:na]
at java.util.Iterator.forEachRemaining(Iterator.java:116) ~[na:1.8.0_201]
at java.util.Spliterators$IteratorSpliterator.forEachRemaining(Spliterators.java:1801) ~[na:1.8.0_201]
at java.util.stream.ReferencePipeline$Head.forEach(ReferencePipeline.java:580) ~[na:1.8.0_201]
at com.consol.citrus.simulator.service.MessageService.saveMessage(MessageService.java:58) ~[citrus-simulator-starter-1.0.3.jar:na]
at com.consol.citrus.simulator.service.MessageService$$FastClassBySpringCGLIB$$be0e8eaa.invoke(<generated>) ~[citrus-simulator-starter-1.0.3.jar:na]
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) ~[spring-core-4.3.21.RELEASE.jar:4.3.21.RELEASE]
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:736) ~[spring-aop-4.3.21.RELEASE.jar:4.3.21.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) ~[spring-aop-4.3.21.RELEASE.jar:4.3.21.RELEASE]
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) ~[spring-tx-4.3.21.RELEASE.jar:4.3.21.RELEASE]
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282) ~[spring-tx-4.3.21.RELEASE.jar:4.3.21.RELEASE]
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) ~[spring-tx-4.3.21.RELEASE.jar:4.3.21.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.21.RELEASE.jar:4.3.21.RELEASE]
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:671) ~[spring-aop-4.3.21.RELEASE.jar:4.3.21.RELEASE]
at com.consol.citrus.simulator.service.MessageService$$EnhancerBySpringCGLIB$$f26ac16e.saveMessage(<generated>) ~[citrus-simulator-starter-1.0.3.jar:na]
at com.consol.citrus.simulator.service.ActivityService.saveScenarioMessage(ActivityService.java:124) ~[citrus-simulator-starter-1.0.3.jar:na]
at com.consol.citrus.simulator.service.ActivityService$$FastClassBySpringCGLIB$$1784762a.invoke(<generated>) ~[citrus-simulator-starter-1.0.3.jar:na]
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) ~[spring-core-4.3.21.RELEASE.jar:4.3.21.RELEASE]
at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:736) ~[spring-aop-4.3.21.RELEASE.jar:4.3.21.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) ~[spring-aop-4.3.21.RELEASE.jar:4.3.21.RELEASE]
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:99) ~[spring-tx-4.3.21.RELEASE.jar:4.3.21.RELEASE]
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:282) ~[spring-tx-4.3.21.RELEASE.jar:4.3.21.RELEASE]
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:96) ~[spring-tx-4.3.21.RELEASE.jar:4.3.21.RELEASE]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) ~[spring-aop-4.3.21.RELEASE.jar:4.3.21.RELEASE]
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:671) ~[spring-aop-4.3.21.RELEASE.jar:4.3.21.RELEASE]
at com.consol.citrus.simulator.service.ActivityService$$EnhancerBySpringCGLIB$$35f927ee.saveScenarioMessage(<generated>) ~[citrus-simulator-starter-1.0.3.jar:na]
at com.consol.citrus.simulator.endpoint.EndpointMessageHandler.saveScenarioMessage(EndpointMessageHandler.java:58) ~[citrus-simulator-starter-1.0.3.jar:na]
at com.consol.citrus.simulator.endpoint.EndpointMessageHandler.handleReceivedMessage(EndpointMessageHandler.java:51) ~[citrus-simulator-starter-1.0.3.jar:na]
at com.consol.citrus.simulator.scenario.ScenarioEndpoint.messageReceived(ScenarioEndpoint.java:111) ~[citrus-simulator-starter-1.0.3.jar:na]
at com.consol.citrus.simulator.scenario.ScenarioEndpoint.receive(ScenarioEndpoint.java:88) ~[citrus-simulator-starter-1.0.3.jar:na]
at com.consol.citrus.simulator.scenario.SVManagerScenario.receive(SVManagerScenario.java:60) ~[classes/:na]
at com.consol.citrus.simulator.scenario.SVManagerScenario.run(SVManagerScenario.java:24) ~[classes/:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_201]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_201]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_201]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_201]
at org.springframework.util.ReflectionUtils.invokeMethod(ReflectionUtils.java:215) ~[spring-core-4.3.21.RELEASE.jar:4.3.21.RELEASE]
at com.consol.citrus.simulator.service.ScenarioExecutionService.lambda$null$3(ScenarioExecutionService.java:150) ~[citrus-simulator-starter-1.0.3.jar:na]
at org.springframework.util.ReflectionUtils.doWithLocalMethods(ReflectionUtils.java:491) ~[spring-core-4.3.21.RELEASE.jar:4.3.21.RELEASE]
at com.consol.citrus.simulator.service.ScenarioExecutionService.lambda$startScenarioAsync$4(ScenarioExecutionService.java:111) ~[citrus-simulator-starter-1.0.3.jar:na]
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511) ~[na:1.8.0_201]
at java.util.concurrent.FutureTask.run(FutureTask.java:266) ~[na:1.8.0_201]
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[na:1.8.0_201]
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[na:1.8.0_201]
at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_201]

К сожалению, я не могу получить последние сборки цитрусовых.Моя установка работает на java 1.8 и citrus 2.7.1

У кого-нибудь когда-нибудь возникала подобная проблема со старой версией Citrus Simulator?

Я благодарен за любую помощь

1 Ответ

0 голосов
/ 25 сентября 2019

Я никогда не исследовал причину этого (ну, очевидно, это какой-то нулевой заголовок), но простой обходной путь ( не решение! ) - переопределить компонент com.consol.citrus.simulator.serviceMessageService следующим образом:

@Service
@Primary
@Transactional
public class NullHeaderAwareMessageService extends MessageService {

    private final MessageRepository messageRepository;

    @Autowired
    public NullHeaderAwareMessageService(MessageRepository messageRepository) {
        super(messageRepository);

        this.messageRepository = messageRepository;
    }

    @Override
    public Message saveMessage(Message.Direction direction, String payload, String citrusMessageId, Map<String, Object> headers) {
        Message message = new Message();
        message.setDate(new Date());
        message.setDirection(direction);
        message.setPayload(payload);
        message.setCitrusMessageId(citrusMessageId);
        if (headers != null) {
            headers.entrySet().stream()
                    .filter(headerEntry -> headerEntry.getValue() != null)
                    .forEach(headerEntry -> message.addHeader(
                                new MessageHeader(headerEntry.getKey(),
                                        StringUtils.abbreviate(headerEntry.getValue().toString(), 255))));
        }

        return messageRepository.save(message);
    }
}
...