我实现了一个创建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"/>
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();
}
答案 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>@Value("${local.server.port}")</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"