我有这个枚举:
public enum SortEnum {
asc, desc;
}
我想用作rest请求的参数:
@RequestMapping(value = "/events", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public List<Event> getEvents(@RequestParam(name = "sort", required = false) SortEnum sort) {
当我发送这些请求时,它工作正常
/events
/events?sort=asc
/events?sort=desc
但是当我发送:
/events?sort=somethingElse
我在控制台中收到500条响应和以下消息:
2019-09-29 17:20:51.600 DEBUG 5104 --- [ XNIO-2 task-6] com.myApp.aop.logging.LoggingAspect : Enter: com.myApp.web.rest.errors.ExceptionTranslator.processRuntimeException() with argument[s] = [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type [java.lang.String] to required type [com.myApp.common.SortEnum]; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.springframework.web.bind.annotation.RequestParam com.myApp.common.SortEnum] for value 'somethingElse'; nested exception is java.lang.IllegalArgumentException: No enum constant com.myApp.common.SortEnum.somethingElse]
2019-09-29 17:20:51.600 DEBUG 5104 --- [ XNIO-2 task-6] com.myApp.aop.logging.LoggingAspect : Exit: com.myApp.web.rest.errors.ExceptionTranslator.processRuntimeException() with result = <500 Internal Server Error,com.myApp.web.rest.errors.ErrorVM@1e3343c9,{}>
2019-09-29 17:20:51.601 WARN 5104 --- [ XNIO-2 task-6] .m.m.a.ExceptionHandlerExceptionResolver : Resolved exception caused by Handler execution: org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type [java.lang.String] to required type [com.myApp.common.SortEnum]; nested exception is org.springframework.core.convert.ConversionFailedException: Failed to convert from type [java.lang.String] to type [@org.springframework.web.bind.annotation.RequestParam com.myApp.common.SortEnum] for value 'somethingElse'; nested exception is java.lang.IllegalArgumentException: No enum constant com.myApp.common.SortEnum.somethingElse
有没有一种方法可以防止spring抛出这些异常并将enum设置为null?
编辑
Strelok接受的答案有效。但是,我决定处理MethodArgumentTypeMismatchException。
@ControllerAdvice
public class ExceptionTranslator {
@ExceptionHandler(MethodArgumentTypeMismatchException.class)
@ResponseBody
public ResponseEntity<Object> handleMethodArgumentTypeMismatchException(MethodArgumentTypeMismatchException e) {
Class<?> type = e.getRequiredType();
String message;
if(type.isEnum()){
message = "The parameter " + e.getName() + " must have a value among : " + StringUtils.join(type.getEnumConstants(), ", ");
}
else{
message = "The parameter " + e.getName() + " must be of type " + type.getTypeName();
}
return buildResponse(HttpStatus.UNPROCESSABLE_ENTITY, message);
}
你可以创建一个自定义转换器,该转换器将null
在提供无效值时返回而不是异常。
像这样:
@Configuration
public class MyConfig extends WebMvcConfigurationSupport {
@Override
public FormattingConversionService mvcConversionService() {
FormattingConversionService f = super.mvcConversionService();
f.addConverter(new MyCustomEnumConverter());
return f;
}
}
一个简单的转换器可能看起来像这样:
public class MyCustomEnumConverter implements Converter<String, SortEnum> {
@Override
public SortEnum convert(String source) {
try {
return SortEnum.valueOf(source);
} catch(Exception e) {
return null; // or SortEnum.asc
}
}
}
我有一个控制器,它的GET方法是这样写的: bean是正确的(getter和setter),服务调用返回带有thingId的正确ThingBean,并且显示了我在edit.jsp的JSP页面。 JSP是: 但是,JSP 显示主题和消息的空白值。是的,这些属性上有吸气剂/二传手。 我有一个非常相似的控制器,工作得很好,除了GET - mapped方法的签名中没有@RequestParam。 我在Sp
我注意到Spring在Spring 4.2中改变了RequestParam将参数封送到控制器endpoint的方式。也就是说,当我有这样的东西: 以前发送的超文本标记语言输入元素的属性为空,将作为空包含在列表中。在4.2中,它们是空字符串。' 例如: 结果为空列表。 结果是
我有这个枚举: 我想用作rest请求的参数: 当我发送这些请求时效果很好 但当我发送: 我收到了500条回复,控制台上有这样一条消息: 有没有办法防止spring抛出这些异常并将枚举设置为null? 编辑 斯特雷洛克公认的答案有效。然而,我决定处理MethodArgumentTypeMismatchException。
我有一个Spring RESTendpoint,具有如下所示的可选请求参数: 当我试图测试这个使用Mockito框架的endpoint时 提前感谢!
问题内容: 方法上的参数指示应从模型中检索参数。如果模型中不存在该参数,则应首先实例化该参数,然后将其添加到模型中。一旦出现在模型中,则应从名称匹配的所有请求参数中填充参数的字段。WebDataBinder类将请求参数名称(包括查询字符串参数和表单字段)匹配,以按名称对属性字段进行建模。 将请求参数绑定到控制器中的方法参数。 我知道与不是同一件事,不是互斥的,不会扮演相同的角色,并且可以同时使用,
我使用的是Spring-MVC3.1.0.版本,由于某种原因,将POST与查询params和请求body进行映射是不起作用的。 下面是我的控制器方法的外观: 但是,如果我将所有请求参数转换为路径参数,映射就会起作用。有人遇到过类似的事情吗? 谢了!