如何在Spring Boot Controller中接受GET参数并返回适当的对象

时间:2018-07-13 10:19:47

标签: spring-mvc spring-boot spring-data-jpa spring-restcontroller spring-rest

对于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会使我的服务器崩溃。

2 个答案:

答案 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模式,这就是我的布局方式:

Controller.java

@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可以是这样的类:

UserModel.java

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。