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.springside.modules.beanvalidator.BeanValidators; import org.xmx0632.deliciousfruit.entity.User; import org.xmx0632.deliciousfruit.service.account.UserService; /** * User的Restful API的Controller. * * @author calvin */ @Controller @RequestMapping(value = "/api/v2/user") public class UserRestController { @Autowired private UserService userService; @Autowired private Validator validator; @RequestMapping(method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody public List<User> list() { return userService.getAllUser(); } @RequestMapping(value = "/{id}", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE) @ResponseBody public ResponseEntity<?> get(@PathVariable("id") Long id) { User user = userService.getUser(id); if (user == null) { return new ResponseEntity(HttpStatus.NOT_FOUND); } return new ResponseEntity(user, HttpStatus.OK); } @RequestMapping(method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE) @ResponseBody public ResponseEntity<?> create(@RequestBody User user, UriComponentsBuilder uriBuilder) { // 调用JSR303 Bean Validator进行校验,如果出错返回含400错误码及json格式的错误信息. Set<ConstraintViolation<User>> failures = validator.validate(user); if (!failures.isEmpty()) { return new ResponseEntity( BeanValidators.extractPropertyAndMessage(failures), HttpStatus.BAD_REQUEST); } userService.updateUser(user); // 按照Restful风格约定,创建指向新用戶的url, 也可以直接返回id或对象. Long id = user.getId(); URI uri = uriBuilder.path("/api/v2/user/" + 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 User user) { // 调用JSR303 Bean Validator进行校验,如果出错返回含400错误码及json格式的错误信息. Set<ConstraintViolation<User>> failures = validator.validate(user); if (!failures.isEmpty()) { return new ResponseEntity( BeanValidators.extractPropertyAndMessage(failures), HttpStatus.BAD_REQUEST); } // 保存 userService.updateUser(user); // 按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) { userService.deleteUser(id); } }