2016-10-27 126 views
2

我有一個簡單的REST服務。有客戶,我可以通過它的ID獲得客戶。如果沒有客戶端請求的ID,應找回404找不到。駱駝REST服務在返回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返回null,我得到以下堆棧跟蹤:

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) 

我無法弄清楚這一點。從bean方法調用返回null應該是可能的,對吧?

+0

什麼駱駝版本你使用?你使用什麼Camel組件作爲HTTP的rest-dsl? –

+0

2.18.0和camel-servlet – verhage

+0

好的...似乎在2.18.0中有一個bug。我降級到2.17.3,它工作正常。這是一個嚴重的問題,我會創建一個測試並報告。 – verhage

回答

0

嘗試作爲一種解決方法使用

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

我懷疑它的.bean(),有一個小錯誤,當你返回null值作爲新郵件正文,這傻瓜底層HttpMessage到思維消息主體尚未初始化,因此您再次讀取流時會出現流錯誤。

+0

這是有道理的。但是,它也不起作用,但錯誤稍有不同:「org.apache.camel.language.bean.RuntimeBeanExpressionException:無法調用方法:getClient($ {header.id}),因爲:org。 apache.camel.RuntimeCamelException:java.io.IOException:流關閉「。這個消息似乎是說clientService爲null('on null'),但這絕對不是這種情況,因爲當getClient返回非空結果時,一切正常。 – verhage

0

我認爲,主要的想法,你可以拋出新的異常SomeClassException如果你的bean沒有找到客戶端ID和其他途徑處理

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})") 
       ;