Man*_*dan 153 spring spring-mvc spring-3 spring-4
我正在使用Spring Framework 4.0.7,以及MVC和Rest
我可以和平地工作:
@Controller ResponseEntity<T>例如:
@Controller
@RequestMapping("/person")
@Profile("responseentity")
public class PersonRestResponseEntityController {
Run Code Online (Sandbox Code Playgroud)
用这个方法(只是为了创建)
@RequestMapping(value="/", method=RequestMethod.POST)
public ResponseEntity<Void> createPerson(@RequestBody Person person, UriComponentsBuilder ucb){
logger.info("PersonRestResponseEntityController - createPerson");
if(person==null)
logger.error("person is null!!!");
else
logger.info("{}", person.toString());
personMapRepository.savePerson(person);
HttpHeaders headers = new HttpHeaders();
headers.add("1", "uno");
//http://localhost:8080/spring-utility/person/1
headers.setLocation(ucb.path("/person/{id}").buildAndExpand(person.getId()).toUri());
return new ResponseEntity<>(headers, HttpStatus.CREATED);
}
Run Code Online (Sandbox Code Playgroud)
返回一些东西
@RequestMapping(value="/{id}", method=RequestMethod.GET)
public ResponseEntity<Person> getPerson(@PathVariable Integer id){
logger.info("PersonRestResponseEntityController - getPerson - id: {}", id);
Person person = personMapRepository.findPerson(id);
return new ResponseEntity<>(person, HttpStatus.FOUND);
}
Run Code Online (Sandbox Code Playgroud)
工作良好
我可以这样做:
@RestController(我知道它与@Controller+ 相同@ResponseBody)@ResponseStatus例如:
@RestController
@RequestMapping("/person")
@Profile("restcontroller")
public class PersonRestController {
Run Code Online (Sandbox Code Playgroud)
用这个方法(只是为了创建)
@RequestMapping(value="/", method=RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
public void createPerson(@RequestBody Person person, HttpServletRequest request, HttpServletResponse response){
logger.info("PersonRestController - createPerson");
if(person==null)
logger.error("person is null!!!");
else
logger.info("{}", person.toString());
personMapRepository.savePerson(person);
response.setHeader("1", "uno");
//http://localhost:8080/spring-utility/person/1
response.setHeader("Location", request.getRequestURL().append(person.getId()).toString());
}
Run Code Online (Sandbox Code Playgroud)
返回一些东西
@RequestMapping(value="/{id}", method=RequestMethod.GET)
@ResponseStatus(HttpStatus.FOUND)
public Person getPerson(@PathVariable Integer id){
logger.info("PersonRestController - getPerson - id: {}", id);
Person person = personMapRepository.findPerson(id);
return person;
}
Run Code Online (Sandbox Code Playgroud)
我的问题是:
Sot*_*lis 192
ResponseEntity用于表示整个HTTP响应.您可以控制进入它的任何内容:状态代码,标题和正文.
@ResponseBody是HTTP响应主体的标记,并@ResponseStatus声明HTTP响应的状态代码.
@ResponseStatus不是很灵活.它标记整个方法,因此您必须确保您的处理程序方法始终以相同的方式运行.你仍然无法设置标题.你需要HttpServletResponse或一个HttpHeaders参数.
基本上,ResponseEntity让你做更多.
Mat*_*att 50
完成Sotorios Delimanolis的答案.
确实,它ResponseEntity为您提供了更大的灵活性,但在大多数情况下您不需要它,并且您最终会ResponseEntity在控制器中无处不在,因此难以阅读和理解.
如果要处理错误(未找到,冲突等)等特殊情况,可以HandlerExceptionResolver在Spring配置中添加.因此,在您的代码中,您只是抛出一个特定的异常(NotFoundException例如)并决定在Handler中做什么(将HTTP状态设置为404),使Controller代码更清晰.
Dan*_*ail 41
根据官方文档:使用@RestController注释创建REST控制器
@RestController是一个结合@ResponseBody和@Controller的构造型注释.更重要的是,它为您的Controller提供了更多的意义,并且可能在框架的未来版本中带来额外的语义.
它似乎最好@RestController用于清晰度,但你也可以在需要时将它与ResponseEntity灵活性结合起来(根据官方教程和这里的代码以及我的问题来确认).
例如:
@RestController
public class MyController {
@GetMapping(path = "/test")
@ResponseStatus(HttpStatus.OK)
public User test() {
User user = new User();
user.setName("Name 1");
return user;
}
}
Run Code Online (Sandbox Code Playgroud)
是相同的:
@RestController
public class MyController {
@GetMapping(path = "/test")
public ResponseEntity<User> test() {
User user = new User();
user.setName("Name 1");
HttpHeaders responseHeaders = new HttpHeaders();
// ...
return new ResponseEntity<>(user, responseHeaders, HttpStatus.OK);
}
}
Run Code Online (Sandbox Code Playgroud)
这样,您ResponseEntity只能在需要时定义.
更新
你可以用这个:
return ResponseEntity.ok().headers(responseHeaders).body(user);
Run Code Online (Sandbox Code Playgroud)
Gau*_*ula 10
适当的REST API应该包含以下组件以作为响应
ResponseEntity的主要目的是提供选项3,而没有ResponseEntity则可以实现其余选项。
因此,如果您想提供资源的位置,那么使用ResponseEntity会更好,否则可以避免。
考虑一个示例,其中修改了API以提供所有提到的选项
// Step 1 - Without any options provided
@RequestMapping(value="/{id}", method=RequestMethod.GET)
public @ResponseBody Spittle spittleById(@PathVariable long id) {
return spittleRepository.findOne(id);
}
// Step 2- We need to handle exception scenarios, as step 1 only caters happy path.
@ExceptionHandler(SpittleNotFoundException.class)
@ResponseStatus(HttpStatus.NOT_FOUND)
public Error spittleNotFound(SpittleNotFoundException e) {
long spittleId = e.getSpittleId();
return new Error(4, "Spittle [" + spittleId + "] not found");
}
// Step 3 - Now we will alter the service method, **if you want to provide location**
@RequestMapping(
method=RequestMethod.POST
consumes="application/json")
public ResponseEntity<Spittle> saveSpittle(
@RequestBody Spittle spittle,
UriComponentsBuilder ucb) {
Spittle spittle = spittleRepository.save(spittle);
HttpHeaders headers = new HttpHeaders();
URI locationUri =
ucb.path("/spittles/")
.path(String.valueOf(spittle.getId()))
.build()
.toUri();
headers.setLocation(locationUri);
ResponseEntity<Spittle> responseEntity =
new ResponseEntity<Spittle>(
spittle, headers, HttpStatus.CREATED)
return responseEntity;
}
// Step4 - If you are not interested to provide the url location, you can omit ResponseEntity and go with
@RequestMapping(
method=RequestMethod.POST
consumes="application/json")
@ResponseStatus(HttpStatus.CREATED)
public Spittle saveSpittle(@RequestBody Spittle spittle) {
return spittleRepository.save(spittle);
}
Run Code Online (Sandbox Code Playgroud)
来源-行动中的春天
| 归档时间: |
|
| 查看次数: |
218932 次 |
| 最近记录: |