这工作正常
在我的基于 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
除了进行这种返回值序列化之外,还有其他方法吗?