反序列化时的Spring Java Rest Handle无效类型
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了反序列化时的Spring Java Rest Handle无效类型相关的知识,希望对你有一定的参考价值。
我正在使用Java REST API来注册用户。我正在尝试检查发送给POST的用户是否具有所有有效的字段,以便可以将其保存到数据库,但是如果其中一个字段的类型无效,我将找不到处理错误的方法。
我的模型User.java
public class User
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private long id;
@Column
private String description;
@Column
private String date_joined;
@Column
private double age;
//setters and getters
用户资源方法:
@POST
@Consumes("application/json")
@Produces("application/json")
public Response postUser(User User)
//validate User fields and save to db
// if valid return following, else send Bad Request
return Response.status(Response.Status.CREATED).entity(User).build();
我正在使用ajax通过以下方式发送数据:
"date_joined":"27/12/19",
"description":"Currently looking for job",
"age":30
在此示例中效果很好,但我想验证发送的数据是否为无效类型,例如:
"date_joined":"27/12/19",
"description":"Currently looking for job",
"age": "thirty"
这将导致以下错误
org.codehaus.jackson.map.JsonMappingException: Can not construct instance of double from String value 'thirty': not a valid Double value
是否有办法捕获这类错误?因此,以后我可以例如向用户发送一条消息,告知他们发送了无效数据
答案
解决方案是捕获异常并在出现JsonMappingException的情况下返回错误消息?
try
return Response.status(Response.Status.CREATED).entity(User).build();
catch (JsonMappingException e)
// Return a 4xx statuscode to indicate a client error and some json containing e.getMessage()
请让我知道这是否有用!谢谢!
:)
另一答案
是。有一种方法。我们可以编写自己的自定义解串器。
我为电子邮件验证编写了反序列化器/验证器。
import org.apache.commons.lang.StringUtils;
import com.fasterxml.jackson.core.JsonParser;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.core.ObjectCodec;
import com.fasterxml.jackson.databind.DeserializationContext;
import com.fasterxml.jackson.databind.JsonDeserializer;
import com.fasterxml.jackson.databind.JsonNode;
public class EmailValidator2 extends JsonDeserializer<String>
@Override
public String deserialize(JsonParser jsonParser, DeserializationContext deserializationContext)
throws IOException, JsonProcessingException
System.out.println("Intercepting deserlization to validate email....");
ObjectCodec objectCodec = jsonParser.getCodec();
JsonNode jsonNode = objectCodec.readTree(jsonParser);
String value = jsonNode.asText();
if (StringUtils.isNotBlank(value) && (!org.apache.commons.validator.routines.EmailValidator.getInstance().isValid(value)))
throw new RuntimeException("Email address is invalid");
return jsonNode.asText();
import org.springframework.stereotype.Service;
import com.fasterxml.jackson.databind.module.SimpleModule;
@Service
public class CustomSerializerAndDeserializerRegistry extends SimpleModule
public CustomSerializerAndDeserializerRegistry()
this.addDeserializer(String.class, new EmailValidator2());
public class User
private String email;
public String getEmail()
return email;
@JsonDeserialize(using = EmailValidator2.class)
@ExceptionHandler
public void setEmail(String email)
this.email = email;
如果需要,我可以提供更多帮助。
以上是关于反序列化时的Spring Java Rest Handle无效类型的主要内容,如果未能解决你的问题,请参考以下文章
Spring Boot REST 服务:JSON 反序列化不起作用
在 Spring Boot + Spring Data Rest 中反序列化时忽略带有 @JsonProperty 的字段
spring-data-rest 和控制器,使用相同的 objectMaper 进行序列化/反序列化
无法使用 guava-datatype 从 Spring 服务中使用 GWTP-Rest + jackson-guava 反序列化 guava 类型