package org.xmx0632.deliciousfruit.rest; import java.net.URI; import java.util.List; import java.util.Set; import javax.validation.ConstraintViolation; import javax.validation.Validator; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.bind.annotation.ResponseStatus; import org.springframework.web.util.UriComponentsBuilder; import org.xmx0632.deliciousfruit.entity.Task; import org.xmx0632.deliciousfruit.service.task.TaskService; import org.springside.modules.beanvalidator.BeanValidators; /** * Task的Restful API的Controller. * * @author calvin */ @Controller @RequestMapping(value = "/api/v1/task") public class TaskRestController { @Autowired private TaskService taskService; @Autowired private Validator validator; @RequestMapping(method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody public List<Task> list() { return taskService.getAllTask(); } @RequestMapping(value = "/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody public ResponseEntity<?> get(@PathVariable("id") Long id) { Task task = taskService.getTask(id); if (task == null) { return new ResponseEntity(HttpStatus.NOT_FOUND); } return new ResponseEntity(task, HttpStatus.OK); } @RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE) @ResponseBody public ResponseEntity<?> create(@RequestBody Task task, UriComponentsBuilder uriBuilder) { // 调用JSR303 Bean Validator进行校验,如果出错返回含400错误码及json格式的错误信息. Set<ConstraintViolation<Task>> failures = validator.validate(task); if (!failures.isEmpty()) { return new ResponseEntity( BeanValidators.extractPropertyAndMessage(failures), HttpStatus.BAD_REQUEST); } // 保存任务 taskService.saveTask(task); // 按照Restful风格约定,创建指向新任务的url, 也可以直接返回id或对象. Long id = task.getId(); URI uri = uriBuilder.path("/api/v1/task/" + id).build().toUri(); HttpHeaders headers = new HttpHeaders(); headers.setLocation(uri); return new ResponseEntity(headers, HttpStatus.CREATED); } @RequestMapping(value = "/{id}", method = RequestMethod.PUT, consumes = MediaType.APPLICATION_JSON_VALUE) public ResponseEntity<?> update(@RequestBody Task task) { // 调用JSR303 Bean Validator进行校验,如果出错返回含400错误码及json格式的错误信息. Set<ConstraintViolation<Task>> failures = validator.validate(task); if (!failures.isEmpty()) { return new ResponseEntity( BeanValidators.extractPropertyAndMessage(failures), HttpStatus.BAD_REQUEST); } // 保存 taskService.saveTask(task); // 按Restful约定,返回204状态码, 无内容. 也可以返回200状态码. return new ResponseEntity(HttpStatus.NO_CONTENT); } @RequestMapping(value = "/{id}", method = RequestMethod.DELETE) @ResponseStatus(HttpStatus.NO_CONTENT) public void delete(@PathVariable("id") Long id) { taskService.deleteTask(id); } }