3

これはうまくいきます

私の 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このような戻り値のシリアル化を行う別の方法はありますか?
4

0 に答える 0