Spring Boot / Java将枚举值映射到RequestParam

时间:2019-03-11 08:09:30

标签: spring-boot spring-mvc java-8 request-mapping

我有一个如下的枚举

public enum Customer {

    RETAIL("retail"),
    FREELANCER("FreeLancer"),
    MARKET("market"),
    PUBLICATION("publication");

    private String contentType;
    private static final Map<String,Customer> contentTypeMap;

    public String getContentType(){
        return this.contentType;
    }

    static {
        Map<String,Customer> map = new ConcurrentHashMap<>();
        for(Customer type : Customer.values ()){
            map.put (type.getContentType (),type);
        }
        contentTypeMap = map;
    }

    Customer(String contentType){
        this.contentType=contentType;
    }

    public static Customer getContentType(String contentType){
        return contentTypeMap.get (contentType);
    }

}

此枚举代表客户类型。

我们有一个返回客户详细信息的API

@RequestMapping(value="/getData", method=RequestMethod.GET, produces="application/json")
public BatchResponse triggerBatchJob(
        @RequestParam(value="updateFrom", required=false) @DateTimeFormat(pattern="yyyyMMdd") String updateFrom,
        @RequestParam(value="updateTo", required=false) @DateTimeFormat(pattern="yyyyMMdd") String updateTo,
        @RequestParam(value="customerType") (VALIDATE_HERE)String customerType) {
    // ...
}

我需要验证customerType值是否为Enum中存在的值,有没有一种方法可以像我在日期的情况下那样使用方法声明来验证相同,而不是通过使用getContentType方法或其他方法来验证方法主体

请帮助。

2 个答案:

答案 0 :(得分:1)

将您的方法更改为以下内容:

@RequestMapping(value="/getData", method=RequestMethod.GET, produces="application/json")
public BatchResponse triggerBatchJob(
        @RequestParam(value="updateFrom", required=false) @DateTimeFormat(pattern="yyyyMMdd") String updateFrom,
        @RequestParam(value="updateTo", required=false) @DateTimeFormat(pattern="yyyyMMdd") String updateTo,
        @RequestParam(value="customerType") CustomerType customerType) {
    // ...
}

即customerType类型应为CustomerType而非String。现在,将仅映射那些与枚举匹配的值。

注意:-必须提供特定格式的值,例如枚举名称本身,例如在您的情况下,FREELANCERRETAILPUBLICATION等值应在请求中传递。

修改

下面的OP要求从String中自定义枚举处理:

在控制器中添加@initBinder并添加以下方法:

@InitBinder
    public void initBinder(final WebDataBinder webdataBinder) {
        webdataBinder.registerCustomEditor(Customer.class, new CustomerConverter());
    }

并声明一个转换器类,如下所示:

import java.beans.PropertyEditorSupport;

public class CustomerConverter extends PropertyEditorSupport{

     public void setAsText(final String text) throws IllegalArgumentException {
         System.out.println("--->"+Customer.getContentType(text));
            setValue(Customer.getContentType(text));
        }¡¡
}

添加了System.out.println以表明该值已按预期进行解释和打印。

答案 1 :(得分:0)

一个简单的空检查就可以了

Customer customer = Customer.getContentType(customerType);
if (customer == null) {
     throw new Exception("Invalid Customer type");// use validation exception 
}