对于Spring Boot我是一个新手,所以我不知道@Controller
类。如果我在Spring Boot中找不到数据库中的特定对象,应该怎么办?如果将返回类型声明为Response Entity
并发送空的User对象,会更好吗?
//Get single user
@GetMapping("/users/{id}")
public User getUser(@PathVariable String id){
try {
Long i = Long.parseLong(id);
} catch (NumberFormatException ex) {
return ???? //Can't figure out what to return here.
}
return userService.getUser(id);
}
我希望使用者知道他们发送了无效的字符串。
2)另外,用户的变量ID为Long
类型。因此,我应该在Long
函数中将参数设为getUser
还是接受String进行解析?如果在链接中发送了字符串,则使用Long
会使我的服务器崩溃。
答案 0 :(得分:3)
这是我用于“按ID获取用户”请求的REST控制器的典型代码:
@RestController
@RequestMapping("/users") // 1
public class UserController {
private final UserRepo userRepo;
public UserController(UserRepo userRepo) {
this.userRepo = userRepo;
}
@GetMapping("/{id}") // 2
public ResponseEntity getById(@PathVariable("id") Long id) { // 3
return userRepo.findById(id) // 4
.map(UserResource::new) // 5
.map(ResponseEntity::ok) // 6
.orElse(ResponseEntity.notFound().build()); // 7
}
}
位置:
1-是此控制器处理的所有请求的通用起始路径
2-GET请求(/users/{id}
)的路径变量模式。
3-提供路径变量的名称,该名称与GetMapping
中的参数相对应。 getById
方法中的参数类型与User
ID的类型相对应。
4-我使用findById
的{{1}}方法返回UserRepo
5-在这里,我将Optional
转换为某种类型的DTO-User
(这是可选步骤)
6-如果找到UserResource
,则返回OK
响应
7-否则返回User
响应。
答案 1 :(得分:2)
我还在几个项目中使用controller-service-repository模式,这就是我的布局方式:
@RestController // 1
@RequestMapping(value = "/users") // 2
public class UserController {
private final UserService userService;
@Autowired // 3
public UserController(UserService userService) {
this.userService = userService;
}
@RequestMapping(value = "/{user_id}", method = RequestMethod.GET) //4
@ResponseStatus(HttpStatus.OK) //5
public UserModel getUser(@PathVariable(value="user_id") long user_id) { //6
return userService.getUserById(user_id);
}
@RequestMapping(method = RequestMethod.POST) // 7
@ResponseStatus(HttpStatus.CREATED) // 8
public UserModel getUser(@ResponseBody UserModel userModel) { // 9
return userService.createUser(usermodel);
}
}
1)@RestController是@Controller和@ResponseBody的组合,这实际上意味着类中的每个方法都有一个响应主体。
2)在此类中使用/ users前缀@RequestMapping值
3)在构造函数中进行自动装配是注入bean的最安全方法。
4)通过对/ users / {user_id}
的GET请求可以访问此方法。5)此方法成功时将返回HttpStatus.OK状态代码(200)
6)从请求中提取路径变量“ user_id”。在此处使用与您的用户ID相同的数字类型(即int或long)。
7)通过/ users的POST请求可以访问此方法
8)此方法成功返回HttpStatus.CREATED状态代码(201)
9)从请求主体中提取UserModel(应具有与稍后提供的json相同的结构)。
与Cepr0和我的方法没有真正的区别,这纯粹是样式偏好。
UserModel可以是这样的类:
public class UserModel {
private String username;
// Constructor, Getter, Setter...
}
这将在响应的主体中返回一个JSON对象,如下所示:
{
"username":"username"
}
如果您想在控制器中处理异常(甚至控制异常返回的数据,则可以这样使用@ExceptionHandler:
@ExceptionHandler(Exception.class)
public ResponseEntity<ErrorResponseWrapper> handleGenericException(Exception ex){
return ResponseEntity
.status(HttpStatus.I_AM_A_TEAPOT)
.body(new CustomExceptionWrapper(ex)));
}
CustomExceptionHandler将应用程序引发的异常转换为您决定的格式(也可以是POJO,Spring Boot会为您将其转换为JSON!)
要更具体地回答您的问题: 1)如果找不到该用户,则应引发一个异常,该异常将包括响应状态404(找不到)。返回null通常是一个坏主意,因为它可能意味着很多事情。
1.1?)如果您的用户发送了无效的字符串,则可以查找它在服务器中导致的异常,并使用异常处理程序来处理它并返回适当的响应(也许是BAD_REQUEST?)
2)是,如果您的使用ID为long,则使用long。
Check out the baeldung site,真的会推荐他们学习Spring Boot。