在HTTP位置标头中动态设置Uri

时间:2016-08-26 20:20:25

标签: spring-integration

我实现了一个创建Employee的Rest服务。在响应消息中,我想使用新创建的Employee资源Uri动态设置HTTP 位置标头。

以下代码运行正常,我可以按预期看到位置标头中的值。但是我在EmpService中对Uri进行了硬编码,我希望它是动态的。如何将Uri信息提取/传递给EmpService bean?

的Config.xml

 <int-http:inbound-gateway
     request-channel="httpPostChannel"
     reply-channel="responseChannel"
     path="/emp"
     supported-methods="POST"   
     message-converters="converters" 
     request-payload-type="com.samples.jaxb.Employee"/>

<int:service-activator ref="empService" method="post"   
                       input-channel="httpPostChannel"   output-channel="responseChannel"/>

EmpService.java

public Message<Employee> post (Message<Employee> msg) {

    Employee emp = empDao.createEmployee(msg.getPayload());
    return MessageBuilder.withPayload(emp)
                         .setHeader(org.springframework.http.HttpHeaders.LOCATION,  "http://localhost:8080/RestSample/emp/" + emp.getEmpId())
                         .build();
}                          

1 个答案:

答案 0 :(得分:1)

实际上,即使你现在的URI是动态的:

  

http://localhost:8080/RestSample/emp/”+ emp.getEmpId()

OTOH你总是可以在应用程序启动期间通过setter或@Value属性从一些外部属性注入它。

或者你甚至可以从传入的Message中提取一些属性/标题。

但是我想你想知道你运行的主机和端口。

您可以通过host了解InetAddress.getLocalHost()

您可以通过适当的ServletContainer供应商API提取port,例如对于Tomcat:Get the server port number from tomcat with out a request

使用Spring Boot,您只需使用@LocalServerPort

* Annotation at the field or method/constructor parameter level that injects the HTTP
* port that got allocated at runtime. Provides a convenient alternative for
* <code>&#064;Value(&quot;${local.server.port}&quot;)</code>.

虽然......我想这个应该足够了:

.setHeader(org.springframework.integration.http.HttpHeaders.REQUEST_URL,
                        request.getURI().toString())

我的意思是Message之后的传入<int-http:inbound-gateway>已设置标头。在我使用Spring Boot和随机Tomcat端口的测试用例中,它看起来像:

"http_requestUrl" -> "http://localhost:64476/service/?name=foo"