Spring Boot/Java Сопоставление значений перечисления с RequestParam

У меня есть Enum, как показано ниже

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 или что-то в этом роде.

Пожалуйста помоги.


person Lucie    schedule 11.03.2019    source источник
comment
Это уже проверено для вас Spring, т.е. если вы передадите какое-либо значение, которое не соответствует доступным значениям, эта конечная точка вернет сообщение об ошибке. Если вы ищете специальные проверки, настроенные для вашего приложения, укажите, какой тип дополнительных проверок вы хотите.   -  person Vinay Prajapati    schedule 11.03.2019


Ответы (2)


Измените свой метод на следующий:

@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. Теперь будут отображаться только те значения, которые соответствуют перечислению.

Примечание. - Значения должны быть указаны в определенном формате, т.е. само имя перечисления, например. в вашем случае значения FREELANCER, RETAIL, PUBLICATION и т. д. должны передаваться в запросе.

Изменить

В соответствии с запросом 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, чтобы показать, что значение интерпретируется и печатается должным образом.

person Vinay Prajapati    schedule 11.03.2019
comment
Я хочу, чтобы они были сопоставлены с розничной торговлей, FreeLancer, рынком, публикацией, в основном внутренними значениями String. - person Lucie; 11.03.2019
comment
я обновил свой ответ - person Vinay Prajapati; 11.03.2019
comment
Большое спасибо, спас мой день. - person Lucie; 12.03.2019

Простая нулевая проверка сделает

Customer customer = Customer.getContentType(customerType);
if (customer == null) {
     throw new Exception("Invalid Customer type");// use validation exception 
}
person user7294900    schedule 11.03.2019
comment
Спасибо за ответ. Если возможно, мне нужно сделать это в самом объявлении метода, а не в теле. Я думаю, это нужно было бы сделать в теле метода - person Lucie; 11.03.2019