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遵循与@RequestMapping. 但这种情况并非如此。相反,当查询这个 WebSocket/STOMP 端点时,@SubscribeMapping/ @MessageMapping-annotated 方法将导致向客户端发送 STOMP 消息,其有效负载/正文对应于“正常”杰克逊序列化规则,例如

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

所以:

  • 如何让@SubscribeMapping/ @MessageMapping-annotated 方法遵循@JsonXXX返回值的自定义注释?
  • @JsonXXX除了进行这种返回值序列化之外,还有其他方法吗?
4

0 回答 0