我有一个如下的枚举
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值是否为枚举中存在的值,是否有方法通过使用getContentType方法或其他方法验证方法声明中的值,就像我在date而不是方法体中所做的那样。
请帮忙。
一个简单的空检查就可以了
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) {
// ...
}
i、 e.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));
}¡¡
}
添加了<代码>系统。出来println显示值按预期解释和打印。
我对的枚举有问题。在方法中有两个枚举:和。是内置的Spring枚举,它完美地从String转换为Enum: 但是当我打电话的时候 我阅读并测试了: 带枚举的Spring的@RequestParam Spring Boot能够接受枚举作为请求参数 枚举作为Spring Boot Rest中的请求参数 如何在RequestParm中将多个值转换为枚举? @RequestParam defaultval
问题内容: 我有一个FlagsAttribute按位枚举,像这样- 现在,在C#中,我将此值存储在一个名为MyProperty的属性中,并保存后将此属性写入我的SQL数据库的整数列中。假设如果我从代码中选择,那么它将在数据库中另存为。 我知道我可以从数据库获取值,只需要将int值类型转换为MyEnum,它将为我提供这些值。但是,我希望对某些存储过程中的SQL数据执行一些操作,在这些存储过程中,显然
问题内容: 假设我有这个枚举: 通过以下映射: 枚举被发送到数据库,,。我希望这些值改为存储为,或存储在varchar列中。 如何将枚举映射到varchar列? 问题答案: 将其添加为EnumType的参数: 这是因为等效于java.sql.Types.VARCHAR
我有一个实体,有一个枚举类型字段和一个具有相同枚举类型和字段名的DTO。 我使用modelMapper创建一个新对象,不需要额外的配置。 但在将dto映射到实体对象后,实体对象上的性别为空。 对象有性别,我已经检查了很多。 请帮我理解这个问题。
问题内容: 我需要预先将未实现接口的枚举映射到现有数据库,该数据库使用将该枚举存储在与所有者类相同的表中。 在这种情况下应如何处理映射?持久化到数据库不会改变,因为实现该接口的所有枚举都将具有不同的值,但是我不确定应如何从数据库中检索对象(我是否需要自定义映射器,它将尝试实例化一个使用指定的enum类进行枚举吗?Hibernate本身是否支持此功能?)。 问题答案: 可以创建一个自定义(例如thi
问题内容: Hibernate提供的注释支持使用或的两种类型的映射。当我们使用映射时,它使用的“名称” 而不是Enum的表示形式。在数据库列仅包含一个字符的情况下,这是一个问题。例如,我有以下枚举: 当我坚持枚举使用,即hibernate尝试在数据库中存储的值是开放的。但是,我的数据库列仅包含一个字符,因此会引发异常。 克服这个问题的一个办法是改变枚举类型持有单个字符(如,代替,)。但是,这降低了