2016-10-27 1 views
2

У меня есть простая служба REST. Есть клиенты, и я могу получить клиента по его идентификатору. В случае отсутствия клиента с запрошенным идентификатором, 404, не найденный, должен быть возвращен.Экспресс-служба верблюда Camel Исключение при возврате null

Вот соответствующая часть:

rest("/client") 
    .consumes("application/json").produces("application/json") 
    .get("{id}") 
     .to("direct:getClient"); 

from("direct:getClient") 
    .bean(clientService, "getClient(${header.id})") 
    .choice() 
     .when(simple("${body} == null")) 
      .setHeader(Exchange.HTTP_RESPONSE_CODE, constant(404)); 

Все хорошо, когда клиенты могут быть найдены, однако, когда клиент не найден и clientService возвращает нуль, я получаю следующую трассировку стека:

org.apache.camel.RuntimeCamelException: java.io.IOException: Stream closed 
    at org.apache.camel.http.common.HttpMessage.createBody(HttpMessage.java:74) 
    at org.apache.camel.impl.MessageSupport.getBody(MessageSupport.java:47) 
    at org.apache.camel.processor.CamelInternalProcessor$StreamCachingAdvice.after(CamelInternalProcessor.java:799) 
    at org.apache.camel.processor.CamelInternalProcessor$StreamCachingAdvice.after(CamelInternalProcessor.java:767) 
    at org.apache.camel.processor.CamelInternalProcessor$InternalCallback.done(CamelInternalProcessor.java:246) 
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:573) 
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:197) 
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:120) 
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:83) 
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:197) 
    at org.apache.camel.component.direct.DirectProducer.process(DirectProducer.java:62) 
    at org.apache.camel.processor.SendProcessor.process(SendProcessor.java:145) 
    at org.apache.camel.management.InstrumentationProcessor.process(InstrumentationProcessor.java:77) 
    at org.apache.camel.processor.RedeliveryErrorHandler.process(RedeliveryErrorHandler.java:542) 
    at org.apache.camel.processor.CamelInternalProcessor.process(CamelInternalProcessor.java:197) 
    at org.apache.camel.processor.Pipeline.process(Pipeline.java:120) 

Я не могу понять это. Возврат null из вызова метода bean должен быть возможен, правильно?

+0

Что Camel версии вы использовать? А какой компонент Camel вы используете с rest-dsl как HTTP? –

+0

2.18.0 и camel-servlet – verhage

+0

Хорошо ... в версии 2.18.0 есть ошибка. Я понизился до 2.17.3, и он отлично работает. Это серьезная проблема, я создам тест и сообщит об этом. – verhage

ответ

0

Try в качестве обходного использовать

.setBody().method(clientService, "getClient(${header.id})") 

Я подозреваю его в .bean(), который имеет небольшую ошибку при возврате значения null в качестве нового тела сообщения, которое дураки, лежащий в основе HttpMessage в домысливать тело сообщения еще не инициализировано, и, таким образом, вы снова получите эту ошибку потока, считывая поток.

+0

Это действительно имеет смысл. Однако он также не работает, но ошибка несколько отличается: «org.apache.camel.language.bean.RuntimeBeanExpressionException: Не удалось вызвать метод: getClient ($ {header.id}) на null из-за: org. apache.camel.RuntimeCamelException: java.io.IOException: поток закрыт ". Это сообщение, кажется, говорит, что clientService имеет значение null (значение «on null»), но это определенно не так, поскольку все работает нормально, когда getClient возвращает ненулевой результат. – verhage

0

Я думаю, что основная идея, что вы можете бросить новый SomeClassException исключения, если ClientID не найден в вашем бобе и обрабатывать в маршруте отдыха

public class SomeClassException extends Exception { 
    private static final long serialVersionUID = 2542653496302641967L;  
    public SomeClassException() { 
    }  
    public SomeClassException(String arg0) { 
     super(arg0); 
    } 
} 

маршрут:

   rest("/client/") 
       .consumes("application/json").produces("application/json") 
       .get("{id}") 
        .to("direct:getClient"); 

       onException(SomeClassException.class) .setHeader(Exchange.HTTP_RESPONSE_CODE, constant(404)).handled(true); 

       from("direct:getClient") 
       .bean(clientService, "getClient(${header.id})") 
       ;