17

在我的请求处理程序中,我想做一些验证,并根据验证检查的结果返回不同的响应(成功/错误)。所以我为响应对象创建了一个抽象类,并为失败案例和成功案例创建了 2 个子类。代码看起来像这样,但它没有编译,抱怨 errorResponse 和 successResponse 无法转换为 AbstractResponse。

我对 Java Generic 和 Spring MVC 很陌生,所以我不知道解决这个问题的简单方法。

@ResponseBody ResponseEntity<AbstractResponse> createUser(@RequestBody String requestBody) {
    if(!valid(requestBody) {
        ErrorResponse errResponse = new ErrorResponse();
        //populate with error information
        return new ResponseEntity<> (errResponse, HTTPStatus.BAD_REQUEST);
    }
    createUser();
    CreateUserSuccessResponse successResponse = new CreateUserSuccessResponse();
    // populate with more info
    return new ResponseEntity<> (successResponse, HTTPSatus.OK);
}
4

2 回答 2

26

这里有两个问题:-

  • 您的返回类型必须更改以匹配两个响应子类ResponseEntity<? extends AbstractResponse>

  • 当您实例化您的 ResponseEntity 时,您不能使用简化的<>语法,您必须指定要使用的响应类new ResponseEntity<ErrorResponse> (errResponse, HTTPStatus.BAD_REQUEST);

     @ResponseBody ResponseEntity<? extends AbstractResponse> createUser(@RequestBody String requestBody) {
         if(!valid(requestBody) {
             ErrorResponse errResponse = new ErrorResponse();
             //populate with error information
             return new ResponseEntity<ErrorResponse> (errResponse, HTTPStatus.BAD_REQUEST);
         }
         createUser();
         CreateUserSuccessResponse successResponse = new CreateUserSuccessResponse();
         // populate with more info
         return new ResponseEntity<CreateUserSuccessResponse> (successResponse, HTTPStatus.OK);
     }
    
于 2013-11-01T19:52:20.037 回答
11

另一种方法是使用错误处理程序

@ResponseBody ResponseEntity<CreateUserSuccessResponse> createUser(@RequestBody String requestBody) throws UserCreationException {
    if(!valid(requestBody) {
        throw new UserCreationException(/* ... */)
    }
    createUser();
    CreateUserSuccessResponse successResponse = new CreateUserSuccessResponse();
    // populate with more info
    return new ResponseEntity<CreateUserSuccessResponse> (successResponse, HTTPSatus.OK);
}

public static class UserCreationException extends Exception {
    // define error information here
}

@ExceptionHandler(UserCreationException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ResponseBody
public ErrorResponse handle(UserCreationException e) {
    ErrorResponse errResponse = new ErrorResponse();
    //populate with error information from the exception
    return errResponse;
}

这种方法可以返回任何类型的对象,因此不再需要用于成功案例和错误案例(甚至案例)的抽象超类。

于 2015-09-17T16:32:19.247 回答