泛型静态方法中的Jackson ObjectMapper [英] Jackson ObjectMapper in Static Method with Generics

查看:215
本文介绍了泛型静态方法中的Jackson ObjectMapper的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个静态方法,该方法旨在使用ObjectMapper读取JSON并解析为Class(在运行时指定).我想返回一个'N'类型的对象,但是我在使用泛型时遇到了一个错误.

I have a static method that is intended to read JSON and Parse to a Class (specified at runtime) with ObjectMapper. I would like to return an Object of the 'N' type, but I'm getting an error about using Generics.

如何使以下代码完成此任务?

How can I make the following code accomplish this?

    public static <N, T extends AbstractRESTApplication> N GET_PAYLOAD( T app, String urlString, REQUEST_TYPE requestType) throws JsonProcessingException, MalformedURLException, IOException, NoSuchAlgorithmException, KeyManagementException {
    HttpsURLConnection con = null;
    try {
        RSSFeedParser.disableCertificateValidation();
        URL url = new URL(urlString);
        con = (HttpsURLConnection) url.openConnection();
        String encoding = Base64.getEncoder().encodeToString((app.getUser() + ":" + app.getPassword()).getBytes("UTF-8"));
        con.setRequestProperty("Authorization", String.format("Basic %s", encoding));
        //con.setDoOutput(true);//only used for writing to. 
        con.setDoInput(true);
        con.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
        con.setRequestMethod(requestType.toString());
        con.setRequestProperty("User-Agent", "Java client");

        DataOutputStream wr = new DataOutputStream(con.getOutputStream());
        //   wr.write(val);
        StringBuilder content;

        try (BufferedReader in = new BufferedReader(
                new InputStreamReader(con.getInputStream()))) {

            String line;
            content = new StringBuilder();

            while ((line = in.readLine()) != null) {
                content.append(line);
                content.append(System.lineSeparator());
            }
            System.out.println(Class.class.getName() + ".GET_PAYLOAD= " + content);
            //Map Content to Class.
            ObjectMapper om = new ObjectMapper();
            return om.readValue(content.toString(),N);//Doesn't Like N type. How do i fix?

        }

    } finally {
        con.disconnect();
    }

}

推荐答案

Java泛型使用类型擦除"实现.这意味着编译器可以检查类型安全性,并在运行时将其删除.

Java Generics are implemented using "type erasure". That means the compiler can check the type safety and the types get removed at run time.

因此,您不能像这样使用类型变量("N").您必须将实际的类作为参数传递:

So you can't use your type variables ("N") like that. You have to pass the actual class as an argument:

public static <N, T extends AbstractRESTApplication> N GET_PAYLOAD( T app,
    String urlString, REQUEST_TYPE requestType,
    Class<N> nClass) throws ... {

    return om.readValue(content.toString(), nClass);

这篇关于泛型静态方法中的Jackson ObjectMapper的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆