8

2 つのリソースを持つ単純な REST サービスを作成しました。最初のリソースはうまく機能し、MediaType.TEXT_PLAIN を返すだけです。

2 番目のリソースでは、POJO を Java にマッピングして、次の例に従いました。

https://github.com/jersey/jersey/tree/2.3.1/examples/json-moxy/src/main/java/org/glassfish/jersey/examples/jsonmoxy

私のテストビーンは次のように定義されています:

@XmlRootElement
public class Company {

    public String name;
    public String symbol;
    public String country;

    public Company(String name, String symbol,
            String country) {
        this.name = name;
        this.symbol = symbol;
        this.country = country;
    }

    public String getName() {
        return name;
    }

    public String getSymbol() {
        return symbol;
    }

    public String getCountry() {
        return country;
    }
}

リソースも簡単です。

@Path("company/{name}")
public class CompanyResource {

    private Map<String, Company> companies;

    public CompanyResource() {
        companies = new LinkedHashMap<String, Company>();
        companies.put("Apple", new Company("Apple Inc.", "AAPL", "USA"));
        companies.put("Microsoft", new Company("Microsoft Corp.", "MSFT", "USA"));
        companies.put("Honda", new Company("Honda Motor Co Ltd", "HMC", "Japan"));
        companies.put("Random", new Company("Random Inc.", "RND", "Undefined"));
    }

    @GET
    @Produces(MediaType.APPLICATION_JSON)
    public Company getCompany(@PathParam("name") String name) {
        Company cmp = companies.get(name);
        if (cmp == null) {
            return companies.get("Random");
        }
        return cmp;
    }
}

リクエストをデバッグし、return ステートメントに問題なく到達しました。ただし、ここから JAXBException がスローされたと思いますが、詳細を表示できず、どこのログにも何も表示されません。ブラウザに「内部サーバー エラー 500」というメッセージが表示されるだけです。

監視構成の下で、必死になってすべてをレベル HIGH に設定しました。それでもどこにも何も表示されません。

私が見つけた唯一の同様の質問は、jax-rs 2.0 と Glassfish 4 で JSON を Pojo に @consume できずJAX RS Jersey + JSON --> HTTP 500 Internal Server Errorでしたが、完全に関連しているようには見えませんでした。

クライアントの場合、「高度なRESTクライアント」アプリでGoogle Chromeを使用しています。

どんな助けでも大歓迎です。

4

3 に答える 3

11

クラスに引数なしのコンストラクターを提供する必要がありますCompany。コンストラクターにアクセスできるユーザーを制限したい場合は、コンストラクターを非公開にすることができます。

private Company() {
}
于 2013-10-24T09:54:04.077 に答える
0

次のように、クラスではなくメソッドにパラメーター「名前」を入れてみてください。

@Path("company")
public class CompanyResource {

    private Map<String, Company> companies;

    public CompanyResource() {
        companies = new LinkedHashMap<String, Company>();
        companies.put("Apple", new Company("Apple Inc.", "AAPL", "USA"));
        companies.put("Microsoft", new Company("Microsoft Corp.", "MSFT", "USA"));
        companies.put("Honda", new Company("Honda Motor Co Ltd", "HMC", "Japan"));
        companies.put("Random", new Company("Random Inc.", "RND", "Undefined"));
    }

    @GET @PathParam("{name}")
    @Produces(MediaType.APPLICATION_JSON)
    public Company getCompany(@PathParam("name") String name) {
        Company cmp = companies.get(name);
        if (cmp == null) {
            return companies.get("Random");
        }
        return cmp;
    }
}

示した方法で使用したい場合は、「名前」をフィールドとしてコンストラクターを追加する必要があります。

public CompanyResource(@PathParam("name") String name) {
   this.name = name;
}
于 2013-10-24T09:54:54.917 に答える