将值注入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转换器/解串器的主要内容,如果未能解决你的问题,请参考以下文章

受 Deadbolt“限制”注释影响的 Jackson 解串器

杰克逊解串器优先级?

加串器解串器

串行解串器 SerDes

改造 + GSON 解串器

DC平衡双向控制解串器 转接IC GM8914:FPD-LINK III转LVTTL芯片