[英]Json deserialize to URL (intercept)
嘗試反序列化URL
時出現此錯誤
Caused by: java.net.MalformedURLException: no protocol: www.boo.com
at java.net.URL.<init>(URL.java:586) ~[na:1.8.0_45]
at java.net.URL.<init>(URL.java:483) ~[na:1.8.0_45]
at java.net.URL.<init>(URL.java:432) ~[na:1.8.0_45]
at com.fasterxml.jackson.databind.deser.std.FromStringDeserializer$Std._deserialize(FromStringDeserializer.java:212) ~[jackson-databind-2.6.2.jar:2.6.2]
at com.fasterxml.jackson.databind.deser.std.FromStringDeserializer.deserialize(FromStringDeserializer.java:122) ~[jackson-databind-2.6.2.jar:2.6.2]
at com.fasterxml.jackson.databind.deser.SettableBeanProperty.deserialize(SettableBeanProperty.java:520) ~[jackson-databind-2.6.2.jar:2.6.2]
at com.fasterxml.jackson.databind.deser.impl.MethodProperty.deserializeAndSet(MethodProperty.java:95) ~[jackson-databind-2.6.2.jar:2.6.2]
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserializeFromObject(BeanDeserializer.java:337) ~[jackson-databind-2.6.2.jar:2.6.2]
at com.fasterxml.jackson.databind.deser.BeanDeserializer.deserialize(BeanDeserializer.java:131) ~[jackson-databind-2.6.2.jar:2.6.2]
at com.fasterxml.jackson.databind.deser.std.CollectionDeserializer.deserialize(CollectionDeserializer.java:245) ~[jackson-databind-2.6.2.jar:2.6.2]
POJO:
class foo {
...
URL url
...
}
如錯誤所示,缺少協議,如果用戶未設置協議,如何在反序列化之前插入協議?
我結合了之前的兩個答案:
public class Foo {
...
@JsonDeserialize(using = UrlDeseralizer.class)
private URL url;
...
}
public class UrlDeseralizer extends JsonDeserializer<URL> {
private Pattern urlPrefix = Pattern.compile("^(https?://|ftp://).*");
@Override
public URL deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
ObjectCodec objectCodec = p.getCodec();
JsonNode node = objectCodec.readTree(p);
String stringUrl = node.asText();
if (!urlPrefix.matcher(stringUrl).matches()) {
return new URL("http://" + stringUrl);
} else {
return new URL(stringUrl);
}
}
}
您可以使用自定義解串器。有關自定義解串器的用法,請參見此處。使用Jackson進行自定義JSON反序列化
您可以使用自定義解串器(請參閱其他答案)。 另一個解決方案(不是那么優雅,但很簡單)是在您的bean中創建一個setter來接受String值,並在創建URL對象之前在內部做一些准備工作:
private Pattern urlPrefix = Pattern.compile("^(https?://|ftp://).*"); //etc.
//...
public void setUrl(String url) {
if (url != null && urlPrefix.matcher(url).matches()) {
this.url = new URL(url);
} else {
this.url = new URL("http://" + url);
}
}
@xedo幫助了我(謝謝!),但是為了更加安全起見,您應該捕獲所有MalformedURLException
:
public class Foo {
...
@JsonDeserialize(using = UrlDeseralizer.class)
private URL url;
...
}
public class UrlDeseralizer extends JsonDeserializer<URL> {
private Pattern urlPrefix = Pattern.compile("^(https?://|ftp://).*");
@Override
public URL deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
ObjectCodec objectCodec = p.getCodec();
JsonNode node = objectCodec.readTree(p);
String stringUrl = node.asText();
try {
return new URL(stringUrl);
} catch (MalformedURLException e) {
// log.debug("Malformed URL: ‘" + stringUrl + "’", e);
return null;
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.