Spring 4.1实例化了一个Jackson ObjectMapper
实例.我有理由希望@Autowire
将该实例放入我的一个控制器中:控制器使用Jackson对其自己进行一些小的JSON解析,但ObjectMapper
它使用的应该是Spring本身正在使用的同一个实例.我该如何完成呢?
请注意,我不是问如何自定义ObjectMapper
Spring正在使用的配置; 我对默认值感到满意.我只想捕获Spring使用的实例,以便我可以在我自己的代码中重用现有实例.
我像这样反序列化jsons:
{
"type":"a",
"payload" : {...}
}
Run Code Online (Sandbox Code Playgroud)
有效负载类型取决于类型.我的课:
public class Sth<T extends Payload> {
@JsonProperty("type")
private String type;
@Valid
private T payload;
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.EXTERNAL_PROPERTY,
property = "type",
visible = true,
defaultImpl = NoClass.class)
@JsonSubTypes({
@JsonSubTypes.Type(value = APayload.class, name = "a"),
@JsonSubTypes.Type(value = BPayload.class, name = "b"),
@JsonSubTypes.Type(value = CPayload.class, name = "c")})
public void setPayload(T payload) {
this.payload = payload;
}
public void setType(String type) {
this.type = type;
}
}
Run Code Online (Sandbox Code Playgroud)
我也输入了没有负载的"d".如果我尝试反序列化:
{
"type":"d",
"payload" …
Run Code Online (Sandbox Code Playgroud) 我有一个名为Product的类和一些扩展它的子类.现在在我的注释中我有很多类型,如下所示:
@JsonTypeInfo(use=JsonTypeInfo.Id.NAME, include=JsonTypeInfo.As.WRAPPER_OBJECT)
@JsonSubTypes({@Type(value=RoomProduct.class, name="RoomProduct"),
@Type(value=GroundProduct.class, name="GroundProduct"),
})
Run Code Online (Sandbox Code Playgroud)
然后是我的Product类的定义.我想要做的是,如果杰克逊不能发现该领域不符合任何这些结构,那么返回
UnknownProduct
我怎么能用Jackson @Type注释做到这一点?它应该是在名称中留空或者某些我不知道的值的标志(我已经尝试创建扩展Product的UnknownProduct并且在名称值中没有任何内容但没有成功.
我有一个返回标记接口的休息服务,这个接口有多个实现,并且在实现中没有任何公共属性.
@RequestMapping(value = "/users/{userName}", method = RequestMethod.GET)
public User getUser(@PathVariable("userName") String userName) {
return userService.getUser(userName);
}
Run Code Online (Sandbox Code Playgroud)
用户及其实现.注意:用户是标记界面.
public interface User {}
public AdminUser implements User { // some properties & its setters & getters }
public SupportUser implements User { // some properties & its setters & getters }
Run Code Online (Sandbox Code Playgroud)
我使用Jackson 1.9.1来序列化和反序列化.
当我达到以上服务时,我的回答低于响应
{}
Run Code Online (Sandbox Code Playgroud)
当我调试它时,我看到用户实现对象已准备好并发送回Jackson进行序列化.但杰克逊正在向浏览器发送空响应.任何人都建议如何在返回类型为标记接口时使用序列化.