1

NetBeansとGlassFishを使用してTweet、RESTサービスからのリストを取得する単純なスタンドアロンアプリケーションを開発しています。これらのオブジェクトには、特に、と呼ばれる変数が含まれtweetています。これは、他のアプリケーションで表示したい文字列値です。

Webサイトアプリケーションを作成し、次のクラスで新しいクラスを作成しました。

RESTService.java:

package service;

import domain.Tweet;
import domain.User;
import java.util.Collection;
import java.util.Date;
import javax.inject.Inject;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;

@Path("/rest")
public class RESTService {

    @Inject
    KwetterService service;

    @GET
    @Path("/{user}")
    public User getUser(@PathParam("user") String userName)
    {
        return service.findByName(userName);
    }

    @GET
    @Path("/{user}/tweets")
    @Produces(MediaType.TEXT_XML)
    public Collection<Tweet> getTweets(@PathParam("user") String userName)
    {
        User user = service.findByName(userName);
        return user.getTweets();
    }
}

スタンドアロンアプリケーションでは、ボタン付きの小さなフォームを作成しました。そのボタンを押して、それらのツイートを取得したいと思います。

NetBeansを使用してRESTクライアントクラスを追加するときに、それをWebサイトのサービスにリンクしました。それは私がRestClient.javaと呼ぶクラスを生成しました:

package service;

import com.sun.jersey.api.client.Client;
import com.sun.jersey.api.client.UniformInterfaceException;
import com.sun.jersey.api.client.WebResource;

public class RestClient {
    private WebResource webResource;
    private Client client;

    public RestClient() {
    }

    public <T> T getUser(Class<T> responseType, String user) throws UniformInterfaceException {
        WebResource resource = webResource;
        resource = resource.path(java.text.MessageFormat.format("{0}", new Object[]{user}));
        return resource.get(responseType);
    }

    public <T> T getTweets(Class<T> responseType, String user) throws UniformInterfaceException {
        WebResource resource = webResource;
        resource = resource.path(java.text.MessageFormat.format("{0}/tweets", new Object[]{user}));
        return resource.accept(javax.ws.rs.core.MediaType.TEXT_XML).get(responseType);
    }
}

アクションボタン実行メソッドでは、そのクラスを使用してツイートを取得しようとしています。そうするとき、それはClass<T> responseTypeそれがつぶやくべきであるユーザー名の隣に隣を尋ねます。

フォームのコードは次のようになります。

private void btnZoekFollowersActionPerformed(java.awt.event.ActionEvent evt) {                                              
        String userName = txtZoekTweets.getText(); //de naam van de user
        RestClient client = new RestClient();
        Collection<Tweet> tweets = client.getTweets(MediaType.TEXT_XML, userName);
        //What to insert for mediatype? Above gives an error since it requires Class<T> responseType
        System.out.println("Datasize: " + data.size());
}

つまり、私の質問は次のとおりClass<T> responseTypeです。パラメータとしてaを挿入する必要があるのはなぜですか?そして、パラメーターとして何を使用する必要がありますか、またはより良いことに、これを行う必要を回避し、代わりにパラメーターとしてユーザー名のみを挿入するにはどうすればよいですか?

次に、アプローチするURLを指定する場所に自分でコードを入力する必要がありますか?それとも、これはすべて設定され、クライアントクラスの生成を通じて機能していますか?

4

1 に答える 1

3

わかりました。クライアントコードにいくつかの問題があります。

問題1

メディアタイプと応答エンティティタイプを混同しています。ジャージーWebResourceクラスは、メソッドを使用するときに、応答をマーシャリングする必要があるとget予想されるエンティティタイプを指定することを想定しています。予想されるメディアタイプを指定する場合は、メソッドAcceptを介してヘッダーを追加する必要がacceptあります(メソッドで実行していますが、実行してgetTweetsいませんgetUser)。

問題2

RESTクライアントクラスには、パラメーター化されたジェネリック関数は必要ありません。返されるオブジェクトの種類を認識するようにメソッドをすでに定義しているので、メソッドシグネチャでそれらのオブジェクトを使用してください。

解決

全体的に、私はあなたのクライアントがこのように見えることを期待します:

public class RestClient {
    private Client client;
    private WebResource webResource;

    public RestClient() {
        super();
    }

    public User getUser(String userName) throws UniformInterfaceException {
        final WebResource userResource = webResource
           .path(String.format("/user/%s", userName))
           .accept(MediaType.TEXT_XML) ;
        return userResource.get(User.class);
    }

    public Collection<Tweet> getTweets(String userName) throws UniformInterfaceException {
        final WebResource tweetResource = webResource
           .path(String.format("/user/%s/tweets", userName))
           .accept(MediaType.TEXT_XML) ;
        return tweetResource.get(new GenericType<Collection<Tweet>>(){});
    }
}

userリソースURLにプレフィックスを追加したことに気付くでしょう。必要に応じて削除できますが、リソースエンドポイントを追加すると、アプリケーションの保守が容易になります。それを保持することにした場合は、サーバー側で次の変更が必要になります。

@Path("/rest")
public class RESTService {

    @Inject
    KwetterService service;

    @GET
    @Path("/user/{userName}")
    public User getUser(@PathParam("userName") String userName)
    {
        return service.findByName(userName);
    }

    @GET
    @Path("/user/{userName}/tweets")
    @Produces(MediaType.TEXT_XML)
    public Collection<Tweet> getTweets(@PathParam("userName") String userName)
    {
        User user = service.findByName(userName);
        return user.getTweets();
    }
}
于 2013-01-22T17:47:11.743 に答える