无法使用基于Jersey的客户端进行REST通话

时间:2018-08-04 22:46:17

标签: java rest jersey

我有一个基于Jersey的REST Client和一个GET调用,定义如下:

在client.get()调用之后,代码没有出来。在client.get()调用上命中了一个空指针异常,这是调用REST客户端的类的初始化逻辑:

Student.java:

public class Student {

    private static RestClient client;

    @SuppressWarnings("static-access")
    public Student(Client client) {
        this.client = new RestClient(client, "xyz");
    }

    public static RestClient getClient() {
        return client;
    }

    public static void addStudent() throws Exception {

        try {       
            String addStudentUri = "https://www.zebapi.com/api/v1/market/ticker-new/btc/inr";     
            ClientResponse js_response = getClient().get(URI.create(addStudentUri));
            String s = js_response.getEntity(String.class);
            System.out.println(s);
        } catch (Exception e) {
            System.out.println(e);          
        }
    }

    public static void main(String[] args) {
        try {
            addStudent();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

RestClient.java

public class RestClient {

    private Client client;
    private String randomHeader = "";

    public RestClient(Client jerseyClient) {
        this.client = jerseyClient;
    }

    public RestClient(Client jerseyClient, String random) {
        this.client = jerseyClient;
        this.randomHeader = random;
    }

    public String getRandomHeader() {
        return randomHeader;
    }

    public void setRandomHeader(String randomHeader) {
        this.randomHeader = randomHeader;
    }

    public RestClient() {
    }

    public ClientResponse get(URI uri)
    {
        return client.resource(uri)
                .get(ClientResponse.class);
    }

    public ClientResponse post(URI uri)
    {
        return client.resource(uri)
                .type(MediaType.APPLICATION_JSON)
                .accept(MediaType.APPLICATION_JSON)
                .post(ClientResponse.class);
    }

}

可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

您从未初始化client,这就是为什么要获得NPE的原因;您正在尝试使用尚未初始化的对象。

您应该做的是从所有方法和static字段中删除所有client修饰符;除了main方法之外的所有方法。然后在main方法中,创建一个新的Student并传入一个新的Client。然后使用该Student实例调用addStudent()方法。

public class Student {
    private RestClient client;

    public Student(Client client) {
        this.client = new RestClient(client, "xyz");
    }

    public RestClient getClient() {
        return this.client;
    }

    public void addStudent() {}

    public static void main(String...args) {
        new Student(Client.create()).addStudent();

        // or a more verbose way
        Client jerseyClient = Client.create();
        Student student = new Student(jerseyClient);
        student.addStudent();
    }
}

我将此标记为Community Wiki,因为实际上应该将其标记为What is a NullPointerException, and how do I fix it?的副本。在某个问题中,关于易于修复的NullPointerException的问题时,这已成为Stack Overflow中的标准做法,我们应该将该问题作为该链接问题的重复项来关闭。

如果

NullPointerException是由开发人员编写的代码引起的,则通常很容易修复。能够检测和修复此问题应该是微不足道的。因此,请查看链接的问题,以便下次可以自行处理此类问题。