gpt4 book ai didi

java - Spring Web Mvc REST 验证

转载 作者:行者123 更新时间:2023-12-01 12:33:01 26 4
gpt4 key购买 nike

请参阅下面的更新。

我正在尝试验证传递到以下 RESTful 端点的参数。

@Controller
@RequestMapping(GlobalConstants.SERVICE_BASE_URL)
public class AuctionsController {

...

@ResponseBody
@RequestMapping( produces = {"application/json", "application/xml"},
method = RequestMethod.GET,
value = "v001/test")
public CommissionsResponse getAuctionCommission( @RequestParam(required = true) Integer someInteger,
@RequestParam(required = false) Integer otherInteger,
@RequestParam(required = true) BigDecimal price,
@RequestParam(required = true) String name) {

MyResponse response = new MyResponse();
response.setSomeInteger(someInteger);
response.setOtherInteger(otherInteger);
response.setPrice(price);
response.setName(name);

return response;
}
}

讨论了 here 如何使用 Spring 的 Web MVC 验证参数。他为此创建了一个处理程序(我已将其放入 ExceptionHandlers 类中)和一个错误 bean:

UPDATE-1::: 下面的方法采用 MethodArgumentNotValidException,仅当 bean 无效时才有效(也就是说,bean 是 Controller 类中用注释标记的参数) @有效的)。所以这永远不会起作用。然而,在最终用户输入错误参数的情况下,我仍然希望能够处理 400。也就是说,例如,当用户为应该是 BigDecimal 的参数输入字符串时。

@ControllerAdvice
public class ExceptionHandlers {


@ExceptionHandler
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ResponseBody
public ErrorMessage handleException(MethodArgumentNotValidException ex) {
List<FieldError> fieldErrors = ex.getBindingResult().getFieldErrors();
List<ObjectError> globalErrors = ex.getBindingResult().getGlobalErrors();
List<String> errors = new ArrayList<>(fieldErrors.size() + globalErrors.size());
String error;
for (FieldError fieldError : fieldErrors) {
error = fieldError.getField() + ", " + fieldError.getDefaultMessage();
errors.add(error);
}
for (ObjectError objectError : globalErrors) {
error = objectError.getObjectName() + ", " + objectError.getDefaultMessage();
errors.add(error);
}
return new ErrorMessage(errors);
}

}

..以及错误 bean

@XmlRootElement
public class ErrorMessage {

private List<String> errors;

public ErrorMessage() {
}

public ErrorMessage(List<String> errors) {
this.errors = errors;
}

public ErrorMessage(String error) {
this(Collections.singletonList(error));
}

public ErrorMessage(String ... errors) {
this(Arrays.asList(errors));
}

public List<String> getErrors() {
return errors;
}

public void setErrors(List<String> errors) {
this.errors = errors;
}
}

我使用下面的方法来 try catch 400,这是在以下测试中抛出的。在这里,我尝试通过使用不正确的价格参数值来抛出 400。

@Test
public void testTheEndpoint() throws Exception {

String url = "v001/test?someInteger=21&otherInteger=456&price=NOT_A_BIG_DECIMAL&name=test";

log.info("Testing Endpoint::: " + url);

MvcResult result = mockMvc.perform(get(url))
.andReturn();

log.info("RESPONSE::: " + result.getResponse().getContentAsString());
}

但是,我使用此方法没有收到任何错误 xml 响应。相反,我的测试只是以 400 失败。有人介意告诉我我在这里做错了什么吗?谢谢!

最佳答案

@ResponseStatus(HttpStatus.BAD_REQUEST) 会将状态代码设置为 400。但是,.andExpect(status().isOk()) 代码段将比较状态代码为 200,这将使测试失败,并且永远不会到达打印内容的行。

关于java - Spring Web Mvc REST 验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25793549/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com