これはうまくいきます
私の Spring ベースのアプリケーションでは、HTTP ベースの REST エンドポイントをセットアップしました。このエンドポイントは JSON を「話します」:
@Controller
public class HttpRestController implements RestController {
@Override
@RequestMapping(value = "/users/{user}", method = RequestMethod.GET)
@ResponseBody
public getUser(@PathVariable User user) {
User jsonFriendlyUser = new JacksonAnnotatedUser(user);
return jsonFriendlyUser;
}
}
これらの JSON ペイロードは通常とは異なる命名規則に従う必要があるため、シリアル化されたプロパティ名をカスタマイズするために@JsonRootName
やなどの注釈を使用しました。@JsonProperty
@JsonRootName("uussaaar")
public class JacksonAnnotatedUser implements User {
//...
public int getId() {
return id;
}
@JsonProperty("naammee")
public String getName() {
return name;
}
@JsonSerialize(using = FriendsJsonSerializer.class )
public Set<User> getFriends() {
return friends;
}
@JsonIgnore
public String getUnimportantProperty() {
return unimportantProperty;
}
}
このカスタム JSON メタデータを使用/users/123
して、HTTP 経由でクエリを実行すると、次の JSON ペイロードが返されます。
{"uussaaar":
{
"id":123,
"naammee":"Charlie",
"friends": [456, 789]
}
}
以下は期待どおりに動作しません
現在、Spring の WebSocket サポートをいじっています。STOMP ベースのREST エンドポイントを作成したいと考えています。したがって、私はStompRestController
このようなものを作成しました:
@Controller
public class StompRestController implements RestController {
@Override
@SubscribeMapping("/users/{user}")
public getUser(@DestinationVariable User user) { // assuming this conversion works
User jsonFriendlyUser = new JacksonAnnotatedUser(user);
return jsonFriendlyUser;
}
@SubscribeMapping
/@MessageMapping
が と同じ JSON シリアル化動作に従うことを期待していたでしょう@RequestMapping
。しかし、そうではありません。代わりに、この WebSocket/STOMP エンドポイントにクエリを実行すると、 @SubscribeMapping
/@MessageMapping
アノテーションが付けられたメソッドは、「通常の」Jackson シリアライゼーション ルールに対応するペイロード/ボディを持つ STOMP メッセージをクライアントに送信します。
{
"id":123,
"name":"Charlie"
"friends":[{argh recursion}, ...],
"unimportantProperty":"This property shall not be part of JSON serialization"
}
したがって:
@SubscribeMapping
/注釈付きの@MessageMapping
メソッド@JsonXXX
が戻り値のカスタム注釈に従うようにするにはどうすればよいですか?@JsonXXX
このような戻り値のシリアル化を行う別の方法はありますか?