将值注入Jackson转换器/解串器
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将值注入Jackson转换器/解串器相关的知识,希望对你有一定的参考价值。
我正在从Ruby应用程序将遗留API移植到Java,充分利用不是静态类型。
在一种这样的情况下,API从JSON主体接受user_id
,该"me"
是数字用户ID或字符串@PUT
@Path("{key}")
@UnitOfWork
public Response getMyObjByKey(@PathParam("key") String key, MyObj myObj) {
myObjDAO.save(myObj);
}
(在将其保存到数据库之前应将其转换为发出请求的用户的ID)。该方法如下所示:
public class UserIdConverter extends StdConverter<String, Integer> {
@Inject
@AuthUser
protected AuthenticatedUser user;
public Integer convert(String strUserId) {
// if strUserId is "me"
return user.getId();
}
}
我有一个转换器,我希望看起来像这样:
user
当然,这不起作用,因为...与导致null
成为User
的生命周期有关。
我的问题是:我有办法访问转换器中的用户对象吗?
据我所知,在反序列化过程中无法访问int
。尝试自定义反序列化器,如果收到String
“me”,则将指示public class MyObjDeserializer extends JsonDeserializer<MyObj>{
@Override
public MyObj deserialize(JsonParser jp, DeserializationContext dc) throws IOException, JsonProcessingException {
ObjectCodec oc = jp.getCodec();
JsonNode node = oc.readTree(jp);
MyObj myobj = new MyObj();
myobj.setName(node.get("name").textValue());
// set other attributes...
String idString = node.get("id").textValue();
int id = -1;
if(!idString.equals("me")) {
// another option: use idString.matches("-?\d+") to check if its a number - https://stackoverflow.com/a/15801999/7015661
id = Integer.parseInt(idString);
}
myobj.setId(id);
return myobj;
}
}
作为id。就像是:
MyObj
然后在你的@JsonDeserialize(using = MyObjDeserializer.class)
类的地方@PUT
@Path("{key}")
@UnitOfWork
public Response getMyObjByKey(@PathParam("key") String key, MyObj myObj, @Auth Optional<User> user) {
if(myObj.getId() == -1){
if(!user.isPresent) // something went very wrong
throw new RuntimeException("User not authenticated");
myObj.setId(user.get().getId()); // set the id to its correct value
}
myObjDAO.save(myObj);
}
使用你自己的解串器。
现在,如果id为“-1”,您可以在资源方法中获取用户自己的id,如下所示:
qazxswpoi
希望这工作:)
以上是关于将值注入Jackson转换器/解串器的主要内容,如果未能解决你的问题,请参考以下文章