如何使用Spring异常处理正确的POST REST错误状态码

19 浏览
0 Comments

如何使用Spring异常处理正确的POST REST错误状态码

我正在尝试处理POST请求中缺失的JSON数据。

我的控制器类

@Controller
@RequestMapping("/testMetrics")
public class TestMetricsEndPoint extends StatusEndpointHandler implements RestEndPoint<TestMetrics,String> {
@Autowired
private ObjectMapper mapper;
@Autowired
private TestMetricsService testMetricsService;
@Override
public Status get(String id) {
    // TODO Auto-generated method stub
    return null;
}
@Override
@RequestMapping(method = RequestMethod.POST,consumes = "application/json", produces = "application/json")
public @ResponseBody Status create(@RequestBody TestMetrics core, BindingResult bindingResult) {
    try {
    if(bindingResult.hasErrors()){
        throw new InvalidRequestException("Add failed, Please try again ", bindingResult);
    }
    if((core.getGroupName()==""||core.getGroupName()==null)&&(core.getTestName()==null||core.getTestName()=="")){
            throw new MissingParametersException(HttpStatus.BAD_REQUEST.value(),"Please provide all necessary parameters");
        } 
    TestMetrics dataObject = testMetricsService.create(core);
    return response(HttpStatus.CREATED.value(),dataObject);
    }catch (MissingParametersException e) {
        return             response(HttpStatus.BAD_REQUEST.value(),e.getLocalizedMessage());
    }
}

扩展类:

public class StatusEndpointHandler {
public Status response(Integer statusCode,Object data){
    Status status = new Status();
    status.setData(data);
    status.setStatus(statusCode);
    return status;
}
}

实现的接口:

 public interface RestEndPoint {
Status get(ID id);
Status create(T entity, BindingResult bindingResult);}

结果:

\"enter

请注意高亮部分

因此,当我尝试通过POSTMAN测试结果时,状态为200 OK。 我不知道如何解决它。 请帮助我解决这种情况。 如何获取正确的状态代码?

admin 更改状态以发布 2023年5月21日
0
0 Comments

在你的catch语句中,尝试通过

response.setStatus( HttpServletResponse.SC_BAD_REQUEST  );

设置状态。

来源

0
0 Comments

你应该把返回类型从 @ResponseBody 改为 ResponseEntity,这样可以允许你修改响应头,从而设置状态码,以下是文档中的一段代码:

 @RequestMapping("/handle")
 public ResponseEntity handle() {
   URI location = ...;
   HttpHeaders responseHeaders = new HttpHeaders();
   responseHeaders.setLocation(location);
   responseHeaders.set("MyResponseHeader", "MyValue");
   return new ResponseEntity("Hello World", responseHeaders, HttpStatus.CREATED);
 }

0