Spring Boot/Java Сопоставление значений Enum с 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 или что-то в этом роде.

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

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

Vinay Prajapati 11.03.2019 10:02
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Версия Java на основе версии загрузки
Версия Java на основе версии загрузки
Если вы зайдете на официальный сайт Spring Boot , там представлен start.spring.io , который упрощает создание проектов Spring Boot, как показано ниже.
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
2
1
8 042
2

Ответы 2

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

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

Спасибо за ответ. Если возможно, мне нужно сделать это в самом объявлении метода, а не в теле. Я думаю, это нужно было бы сделать в теле метода

Lucie 11.03.2019 10:09

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

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

Я хочу, чтобы они были сопоставлены с розничной торговлей, FreeLancer, рынком, публикацией, в основном внутренними значениями String.

Lucie 11.03.2019 10:24

я обновил свой ответ

Vinay Prajapati 11.03.2019 19:44

Большое спасибо, спас мой день.

Lucie 12.03.2019 09:28

Другие вопросы по теме