使用spring集成获取PathVariable

时间:2014-10-29 10:01:11

标签: java spring-integration

来自此网址      想提取pdf名称

localhost:port/server/InboundGateway/pdf/
<int-http:inbound-gateway id="InboundGateway"
    request-channel="request" reply-channel="response"  supported-methods="GET,POST"
    request-payload-type="java.lang.String" path="/InboundGateway/{type}"
    <int-http:header name="type" expression="#pathVariables.type" />
</int-http:inbound-gateway>

在上面的代码中(int-http:header name =&#34; type&#34;)类型将是pdf 但是如何在java代码中提取它的值我无法获得HttpServletRequest

我在支持方法

的基础上进行路由
<int:router input-channel="request" expression="headers.http_requestMethod">
    <int:mapping value="POST" channel="contentDownload" />
</int:router>

<int:service-activator input-channel="contentDownload"
    method="extract" ref="downloadPayloadExtractor" output-channel="contentRouter"></int:service-activator>
在DownloadPayloadExtractor中的

我想得到PathVariable

这些是日志的

SEVERE: Servlet.service() for servlet [InboundGateway] in context with path [/mgl-crm-server] threw exception

org.springframework.integration.MessageHandlingException:java.lang.IllegalArgumentException:必需的标头不可用:type     在org.springframework.integration.handler.MethodInvokingMessageProcessor.processMessage(MethodInvokingMessageProcessor.java:76)     在org.springframework.integration.handler.ServiceActivatingHandler.handleRequestMessage(ServiceActivatingHandler.java:64)     在org.springframework.integration.handler.AbstractReplyProducingMessageHandler.handleMessageInternal(AbstractReplyProducingMessageHandler.java:98)     在org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:78)     在org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:110)     在org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:97)     在org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:61)     在org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:157)     在org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:128)     在org.springframework.integration.core.MessagingTemplate.doSend(MessagingTemplate.java:288)     在org.springframework.integration.core.MessagingTemplate.send(MessagingTemplate.java:149)     在org.springframework.integration.router.AbstractMessageRouter.handleMessageInternal(AbstractMessageRouter.java:220)     在org.springframework.integration.handler.AbstractMessageHandler.handleMessage(AbstractMessageHandler.java:78)     在org.springframework.integration.dispatcher.UnicastingDispatcher.doDispatch(UnicastingDispatcher.java:110)     在org.springframework.integration.dispatcher.UnicastingDispatcher.dispatch(UnicastingDispatcher.java:97)     在org.springframework.integration.channel.AbstractSubscribableChannel.doSend(AbstractSubscribableChannel.java:61)     在org.springframework.integration.channel.AbstractMessageChannel.send(AbstractMessageChannel.java:157)     在org.springframework.integration.core.MessagingTemplate.doSend(MessagingTemplate.java:288)     在org.springframework.integration.core.MessagingTemplate.doSendAndReceive(MessagingTemplate.java:318)     在org.springframework.integration.core.MessagingTemplate.sendAndReceive(MessagingTemplate.java:239)     在org.springframework.integration.gateway.MessagingGatewaySupport.doSendAndReceive(MessagingGatewaySupport.java:233)     在org.springframework.integration.gateway.MessagingGatewaySupport.sendAndReceiveMessage(MessagingGatewaySupport.java:207)     在org.springframework.integration.http.inbound.HttpRequestHandlingEndpointSupport.doHandleRequest(HttpRequestHandlingEndpointSupport.java:271)     在org.springframework.integration.http.inbound.HttpRequestHandlingMessagingGateway.handleRequest(HttpRequestHandlingMessagingGateway.java:95)     在org.springframework.web.context.support.HttpRequestHandlerServlet.service(HttpRequestHandlerServlet.java:67)     在javax.servlet.http.HttpServlet.service(HttpServlet.java:727)     在org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303)     在org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)     在org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)     在org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)     在org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)     at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)     在org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)     在org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)     在org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)     在org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)     在org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1070)     at org.apache.coyote.AbstractProtocol $ AbstractConnectionHandler.process(AbstractProtocol.java:611)     at org.apache.tomcat.util.net.JIoEndpoint $ SocketProcessor.run(JIoEndpoint.java:314)     at java.util.concurrent.ThreadPoolExecutor $ Worker.runTask(ThreadPoolExecutor.java:886)     at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:908)     at org.apache.tomcat.util.threads.TaskThread $ WrappingRunnable.run(TaskThread.java:61)     在java.lang.Thread.run(Thread.java:662) 引起:java.lang.IllegalArgumentException:必需的标头不可用:类型     在org.springframework.util.Assert.isTrue(Assert.java:65)     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)     在java.lang.reflect.Method.invoke(Method.java:597)     在org.springframework.expression.spel.support.ReflectiveMethodExecutor.execute(ReflectiveMethodExecutor.java:58)     在org.springframework.expression.spel.ast.MethodReference.getValueInternal(MethodReference.java:104)     在org.springframework.expression.spel.ast.CompoundExpression.getValueInternal(CompoundExpression.java:57)     在org.springframework.expression.spel.ast.Ternary.getValueInternal(Ternary.java:55)     在org.springframework.expression.spel.ast.MethodReference.getValueInternal(MethodReference.java:60)     在org.springframework.expression.spel.ast.CompoundExpression.getValueInternal(CompoundExpression.java:57)     在org.springframework.expression.spel.ast.SpelNodeImpl.getTypedValue(SpelNodeImpl.java:102)     在org.springframework.expression.spel.standard.SpelExpression.getValue(SpelExpression.java:102)     在org.springframework.integration.util.AbstractExpressionEvaluator.evaluateExpression(AbstractExpressionEvaluator.java:126)     在org.springframework.integration.util.MessagingMethodInvokerHelper.processInternal(MessagingMethodInvokerHelper.java:225)     在org.springframework.integration.util.MessagingMethodInvokerHelper.process(MessagingMethodInvokerHelper.java:125)     在org.springframework.integration.handler.MethodInvokingMessageProcessor.processMessage(MethodInvokingMessageProcessor.java:73)     ......还有42个

1 个答案:

答案 0 :(得分:0)

由于Framewrok与Message<?>达成交易,您确实可以正确地将PathVariable填充到MessageHeaders

改善代码的唯一一件事就是问题&#34;如何访问type标题?&#34;。那么,你应该改进POJO方法:

public Object extract(Object payload, @Header("type") String type) {
....
}

这就是全部。

查看Reference Manual中的更多信息。

<强>更新

  

所需的标头不可用:输入

好吧,将其添加到您的配置中:

<wire-tap channel="logging">

<logging-channel-adapter id="logging" log-full-message="true" level="ERROR"/>

在收到请求后直到该异常分享日志。