在我的基于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
进行此类返回值序列化?