使用Spring WebSocket @ MessageMapping / @ SubscribeMapping的自定义JSON序列化

时间:2014-06-17 00:09:45

标签: spring spring-mvc jackson stomp spring-websocket

这很好用

在我的基于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元数据,通过HTTP查询/users/123将返回以下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遵循与@RequestMapping相同的JSON序列化行为。但这种情况并非如此。相反,当查询此WebSocket / STOMP端点时,@SubscribeMapping / @MessageMapping - 带注释的方法将导致向客户端发送STOMP消息,其中有效负载/主体对应于&#34; normal&#34;杰克逊序列化规则,例如

{
    "id":123,
    "name":"Charlie"
    "friends":[{argh recursion}, ...],
    "unimportantProperty":"This property shall not be part of JSON serialization"
}

因此:

  • 如何让@SubscribeMapping / @MessageMapping - 带注释的方法遵循返回值的自定义@JsonXXX注释?
  • 是否还有另一种方法@JsonXXX进行此类返回值序列化?

0 个答案:

没有答案