我有一个简单的REST服务。有客户,我可以通过其ID获得客户。如果没有具有所请求ID的客户端,则应返回未找到的404。
以下是相关部分:
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 :(得分:0)
尝试使用
作为解决方法.setBody().method(clientService, "getClient(${header.id})")
我怀疑它的.bean()在你将null
值作为新邮件正文返回时会有一点错误,这会让底层的HttpMessage
认为邮件正文没有被删除尚未初始化,因此您再次读取流时会出现该流错误。
答案 1 :(得分:0)
我认为,如果在bean中找不到clientid并在rest路径中处理
,那么你可以抛出新异常SomeClassException的主要思想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})")
;
答案 2 :(得分:0)
在方法上返回NO_CONTENT
时遇到了类似的问题,该方法可以选择是否返回对象,具体取决于是否排队。代码的结构如下:
rest("/foo")
.get("/bar").route().to("direct:foo").endRest()
;
from("direct:bar")
.process(exchange -> {
// ... service calls that eventually resulted in this ...
// (status code of 204 and a body of null)
ResponseEntity responseEntity =
exchange.getIn().getBody(ResponseEntity.class);
exchange.getIn().setHeader(Exchange.HTTP_RESPONSE_CODE, responseEntity.getStatusCodeValue());
exchange.getIn().setBody(responseEntity.getBody());
})
.marshal().json(JsonLibrary.Jackson)
;
即使我单步执行代码并看到所有过程均按预期进行,我也遇到了相同的错误org.apache.camel.RuntimeCamelException: java.io.IOException: Stream closed
。像您一样,该方法返回一个对象时一切正常,但仅当主体设置为null
时才抛出此异常。
在这一点上,我认为在将响应主体设置为null
时,骆驼中发生了一系列复杂的事件,这些事件出错了。单步执行代码并没有我希望的那样有用,因此我只是查看了在NO_CONTENT
或NOT_FOUND
情况下响应实体的标准做法,并偶然发现了{{3 }}。我相信骆驼与转换器的工作方式相同,并且需要某种类型的对象,所以我只是这样修改我的代码:
exchange.getIn().setBody(responseEntity.getBody() == null ? "" : responseEntity.getBody());
结果,返回给客户端的邮件中仍然没有正文,也没有更多的IOException: Stream closed
错误。
答案 3 :(得分:0)
当引发类似错误的根本原因是无效的Json时,只需添加特定场景即可。
考虑以下特定示例:
String tempDate = yourExchangeObject.getIn().getBody(String.class);
JSONObject inputJson = new JSONObject(tempDate); //Exception