简单GET请求项目中的JAX-RS PostConstruct / Inject标记

时间:2015-03-03 20:53:37

标签: java xml annotations jax-rs

我一直在解构某人的项目,该项目从第三方API检索响应并将其打印到Vaadin Web GUI。

我的版本应该从动漫网站检索API响应,自动解析(??)到一个对象然后将对象属性打印到我的屏幕主要是因为我可以看到它是否有血腥作用。

我将一个示例XML文件转换为XSD,然后使用JAXB从中生成一个类(以及一个构建器,但我还不太清楚它是如何使用的),以便从API中存储我的响应。

我有一个执行get请求的getservice java类。之前我正在做的就是将请求的结果打印到字符串中,之后我尝试将其放入对象中。

最后,我有一个主要的JavaApplication4类,显然需要创建一个请求实例(我对OO编程很新,但它可能有点意义)。

应用程序运行但我现在收到一条错误消息:

Exception in thread "main" java.lang.NullPointerException
    at javaapplication4.getservice.fetchMovie(getservice.java:36)
    at javaapplication4.JavaApplication4.main(JavaApplication4.java:17)
Java Result: 1
BUILD SUCCESSFUL (total time: 0 seconds)

这指向我

   return target.queryParam("anime", "4658")
            .request(MediaType.TEXT_HTML)
            .header("Content-type", "text/html")//application_json or text_html or xml
            .get(Ann.class);

我使用了一个断点,发现我的客户端和目标在这里和上面的行都保持为null:

@PostConstruct
    protected void init() {
        client = ClientBuilder.newClient();
        //target = client.target("http://www.omdbapi.com");
        target = client.target("http://cdn.animenewsnetwork.com/encyclopedia/api.xml");
}

回顾原始人的项目,我认为问题是因为我使用@PostConstruct之类的注释但没有@Inject注释。我试图将@Inject添加到我的Main / JavaApplication4文件中,但它要么做任何事情(并且看起来完全错误),要么它告诉我它不适用于我放置的地方。

我非常感谢有人快速浏览并查看是否有导致问题的注释...我不知道如何在任何环境中使用它们而且很难找到做的例子事情以某种特定的方式,我只是试着重新定位点几个小时,显然这不起作用XD

项目的完整代码,减去Ann.java类(它应该以动画,标题,名称等形式存储API响应)和与它一起生成的ObjectFactory.java类(和im)不知道它做了什么,但那是另一步):

Ann.java (我认为是getter和setter以及xml的东西)

ObjectFactory.java

JavaApplication4.java

package javaapplication4;

import generated.Ann;
import javax.inject.Inject;

public class JavaApplication4 {

//@Inject
//getservice gt;

public static void main(String[] args) {

//@Inject
 getservice gt = new getservice(); 


String output = gt.fetchMovie().getAnime().getName();


System.out.println(output);

}
}

getservice.java

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package javaapplication4;

import generated.Ann;
import javax.annotation.PostConstruct;
import javax.enterprise.context.ApplicationScoped;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.WebTarget;
import javax.ws.rs.core.MediaType;

/**
 *
 * @author J
 */

@ApplicationScoped
public class getservice {

    private Client client;
    private WebTarget target;

    @PostConstruct
    protected void init() {
        client = ClientBuilder.newClient();
        //target = client.target("http://www.omdbapi.com");
        target = client.target("http://cdn.animenewsnetwork.com/encyclopedia/api.xml");
    }

// these apparently stay null when i run JavaAppliation4
// do i need an @Inject somewhere or something completely similar or different?

    public Ann fetchMovie() {
        //return target.queryParam("anime", "4658")
        return target.queryParam("anime", "4658")
                .request(MediaType.TEXT_HTML)
                .header("Content-type", "text/html")//application_json or text_html or xml
                .get(Ann.class);
    }
}

三江源。它只是其中一个部分,我被困住了所以我会继续尝试#34;看起来它不会让我走得很远... ... ...)

1 个答案:

答案 0 :(得分:0)

@Inject和@Postconstruct与"托管bean",CDI相关。默认情况下,所有Java EE服务器都提供CDI。如果您希望在普通Java SE环境中使用它,则需要像Weld这样的CDI实现。请参阅this blog entry如何做到这一点。