首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Spring's @RequestParam with Enum

Spring's @RequestParam with Enum
EN

Stack Overflow用户
提问于 2016-09-29 15:30:16
回答 9查看 122.5K关注 0票数 89

我有这样的观点:

代码语言:javascript
复制
public enum SortEnum {
    asc, desc;
}

作为rest请求的参数:

代码语言:javascript
复制
@RequestMapping(value = "/events", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
public List<Event> getEvents(@RequestParam(name = "sort", required = false) SortEnum sort) {

当我发送这些请求时,效果很好。

代码语言:javascript
复制
/events 
/events?sort=asc
/events?sort=desc

但当我发送:

代码语言:javascript
复制
/events?sort=somethingElse

我收到了500个响应,控制台中有这样的消息:

代码语言:javascript
复制
2016-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]
2016-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,{}>
2016-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抛出这些异常并将枚举设置为null?

编辑

史翠洛的公认答案奏效了。但是,我决定处理MethodArgumentTypeMismatchException。

代码语言:javascript
复制
@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);
    }
EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2016-09-29 15:44:30

您可以创建一个自定义转换器,当提供无效值时,它将返回null而不是异常。

就像这样:

代码语言:javascript
复制
@Configuration
public class MyConfig extends WebMvcConfigurationSupport {
   @Override
   public FormattingConversionService mvcConversionService() {
       FormattingConversionService f = super.mvcConversionService();
       f.addConverter(new MyCustomEnumConverter());
       return f;
   }
}

一个简单的转换器可能如下所示:

代码语言:javascript
复制
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
       }
    }
}
票数 65
EN

Stack Overflow用户

发布于 2018-11-12 16:12:40

如果您使用的是Spring,那么这就是原因您不应该使用WebMvcConfigurationSupport

最佳实践是,您应该实现接口org.springframework.core.convert.converter.Converter,并使用注释@Component。然后Spring将自动加载所有Converter的bean. 弹簧启动码

代码语言:javascript
复制
@Component
public class GenderEnumConverter implements Converter<String, GenderEnum> {
    @Override
    public GenderEnum convert(String value) {
        return GenderEnum.of(Integer.valueOf(value));
    }
}

演示项目

票数 74
EN

Stack Overflow用户

发布于 2016-09-29 15:51:59

您需要执行以下操作

代码语言:javascript
复制
@InitBinder
public void initBinder(WebDataBinder dataBinder) {
    dataBinder.registerCustomEditor(YourEnum.class, new YourEnumConverter());
}

请参阅以下内容:https://machiel.me/post/java-enums-as-request-parameters-in-spring-4/

票数 26
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39774427

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档