簡體   English   中英

Json反序列化為URL(攔截)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM