У меня есть 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 или что-то в этом роде.
Пожалуйста помоги.




Простая нулевая проверка сделает
Customer customer = Customer.getContentType(customerType);
if (customer == null) {
throw new Exception("Invalid Customer type");// use validation exception
}
Спасибо за ответ. Если возможно, мне нужно сделать это в самом объявлении метода, а не в теле. Я думаю, это нужно было бы сделать в теле метода
Измените свой метод на следующий:
@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.
я обновил свой ответ
Большое спасибо, спас мой день.
Это уже проверено для вас Spring, т.е. если вы передадите какое-либо значение, которое не соответствует доступным значениям, эта конечная точка вернет сообщение об ошибке. Если вы ищете специальные проверки, настроенные для вашего приложения, укажите, какой тип дополнительных проверок вы хотите.