私はRESTful APIを構築しており、JSONレスポンスで返すフィールドを選択するオプションを開発者に提供したいと考えています。 This blog postは、いくつかのAPI(Google、Facebook、LinkedIn)が開発者にどのようにレスポンスをカスタマイズできるかの例を示しています。これをパーシャルレスポンスと呼びます。Javaを使用して部分的なJSON応答を返す方法は?
の例では、次のようになります。
/users/123?fields=userId,fullname,title
をAPI上記の例ではuserId、ユーザー「123」のためのfullNameとタイトルのフィールドを返す必要があります。
私はRESTful Webサービスでこれを実装する方法のアイデアを探しています。私は現在CXF(編集:とジャクソン)を使用していますが、JAX-RSの別の実装を試してみます。
ここに私の現在のものがあります。完全なUserオブジェクトを返します。 API呼び出し側が実行時に "fields"パラメタに基づいて欲しいフィールドだけを返すにはどうすればよいですか?私は他のフィールドをNullにしたくありません。私は単にそれらを返すことを望んでいません。
@GET
@Path("/{userId}")
@Produces("application/json")
public User getUser(@PathParam("userId") Long userId,
@DefaultValue("userId,fullname,title") @QueryParam("fields") String fields) {
User user = userService.findOne(userId);
StringTokenizer st = new StringTokenizer(fields, ",");
while (st.hasMoreTokens()) {
// here's where i would like to select only the fields i want to return
}
return user;
}
UPDATE:私は自分のドメインクラスに@JsonFilter("myFilter")
を追加その情報でhttp://wiki.fasterxml.com/JacksonFeatureJsonFilter
:私はこれにリンクされているunludoのリンクをたどっ
。次に、RESTfulサービスメソッドを変更して、ユーザーの代わりにStringを返すようにしました。
@GET
@Path("/{userId}")
@Produces("application/json")
public String getUser(@PathParam("userId") Long userId,
@DefaultValue("userId,fullname,title") @QueryParam("fields") String fields) {
User user = userService.findOne(userId);
StringTokenizer st = new StringTokenizer(fields, ",");
Set<String> filterProperties = new HashSet<String>();
while (st.hasMoreTokens()) {
filterProperties.add(st.nextToken());
}
ObjectMapper mapper = new ObjectMapper();
FilterProvider filters = new SimpleFilterProvider().addFilter("myFilter",
SimpleBeanPropertyFilter.filterOutAllExcept(filterProperties));
try {
String json = mapper.filteredWriter(filters).writeValueAsString(user);
return json;
} catch (IOException e) {
e.printStackTrace();
return e.getMessage();
}
}
これ以上のテストを行う必要があります。
フィールドクエリパラメータオプションで大文字小文字を区別しないようにするにはどうすればよいですか? –