关键点是使用
UriComponentsBuilder
。有几种方法可以获取它的实例:
MvcUriComponentsBuilder
中预配置的UriComponentsBuilder
- 作为参数注入到方法中的
UriComponentsBuilder
MvcUriComponentsBuilder
中预配置的UriComponentsBuilder
通过这种方式,您可以获得一个已配置的UriComponentsBuilder
,用于生成指向某些控制器方法的URI,并具有预定义的参数。
以下是MvcUriComponentsBuilder
的javadoc示例:
例如,给定此控制器:
@RequestMapping("/people/{id}/addresses")
class AddressController {
@RequestMapping("/{country}")
public HttpEntity<Void> getAddressesForCountry(@PathVariable String country) { ... }
@RequestMapping(value="/", method=RequestMethod.POST)
public void addAddress(Address address) { ... }
}
可以创建一个UriComponentsBuilder:
MvcUriComponentsBuilder.fromMethodCall(
on(AddressController.class).getAddressesForCountry("US")).buildAndExpand(1);
有时候更好的选择是通过名称指定控制器方法:
UriComponents uriComponents = MvcUriComponentsBuilder.fromMethodName(
AddressController.class, "getAddressesForCountry", "US").buildAndExpand(1);
URI nextUri = uriComponents.toUri();
UriComponentsBuilder
注入方法的参数
从Spring 3.1开始,可以使用UriComponentBuilder
参数创建Location
并将其设置为返回的ResponseEntity
。 UriComponentBuilder
了解上下文并操作相对路径:
@RequestMapping(method = RequestMethod.POST)
public ResponseEntity<?> createCustomer(UriComponentsBuilder b) {
UriComponents uriComponents =
b.path("/customers/{id}").buildAndExpand(id);
HttpHeaders headers = new HttpHeaders();
headers.setLocation(uriComponents.toUri());
return new ResponseEntity<Void>(headers, HttpStatus.CREATED);
}
自版本4.1起,您甚至可以使其更短。
@RequestMapping(method = RequestMethod.POST)
public ResponseEntity<?> createCustomer(UriComponentsBuilder b) {
UriComponents uriComponents =
b.path("/customers/{id}").buildAndExpand(id);
return ResponseEntity.created(uriComponents.toUri()).build();
}
感谢Dieter Hubau指出此事。