在不使用@JsonCreator
注解的情况下,可以通过自定义序列化和反序列化逻辑来将请求参数中的整型转换为枚举类型的字段。以下是一个基于Jackson库的解决方案示例:
假设我们有一个枚举类型Status
和一个对应的DTO类RequestData
:
public enum Status {
ACTIVE(1),
INACTIVE(0);
private final int code;
Status(int code) {
this.code = code;
}
public int getCode() {
return code;
}
public static Status fromCode(int code) {
for (Status status : Status.values()) {
if (status.getCode() == code) {
return status;
}
}
throw new IllegalArgumentException("Unknown status code: " + code);
}
}
public class RequestData {
private Status status;
// Getter and Setter
public Status getStatus() {
return status;
}
public void setStatus(Status status) {
this.status = status;
}
}
为了在不使用@JsonCreator
的情况下进行转换,我们可以自定义一个JsonDeserializer
:
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.annotation.JsonDeserialize;
import java.io.IOException;
@JsonDeserialize(using = StatusDeserializer.class)
public class RequestData {
private Status status;
// Getter and Setter
public Status getStatus() {
return status;
}
public void setStatus(Status status) {
this.status = status;
}
}
class StatusDeserializer extends JsonDeserializer<Status> {
@Override
public Status deserialize(JsonParser p, DeserializationContext ctxt)
throws IOException, JsonProcessingException {
int code = p.getIntValue();
return Status.fromCode(code);
}
}
原因:默认情况下,Jackson库可能无法直接将整型值映射到枚举类型,尤其是没有使用@JsonCreator
注解时。
解决方法:通过自定义JsonDeserializer
,我们可以控制如何从JSON中读取整型值并将其转换为枚举实例。
假设我们有一个REST API接收如下JSON请求:
{
"status": 1
}
使用上述配置后,Jackson会自动使用StatusDeserializer
来处理status
字段的反序列化,将其正确地转换为Status.ACTIVE
枚举值。
这种方法不仅提高了代码的可维护性和灵活性,还确保了数据在传输和处理过程中的准确性和一致性。
领取专属 10元无门槛券
手把手带您无忧上云