关键是使用UriComponentsBuilder。
有几种方法可以获取它的实例
- 预配置
UriComponentsBuilder 来自 MvcUriComponentsBuilder
-
UriComponentsBuilder 作为方法的参数注入
预配置 UriComponentsBuilder 来自 MvcUriComponentsBuilder
通过这种方式,您可以获得UriComponentsBuilder,该UriComponentsBuilder 被配置为生成URI,它指向一些具有预定义参数的控制器方法。
这是来自javadoc 的MvcUriComponentsBuilder 示例:
例如,给定这个控制器:
@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:
// Inline style with static import of "MvcUriComponentsBuilder.on"
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 开始,Location 可以使用 UriComponentBuilder 参数制作并将其设置为返回的 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 指出这一点。