簡體   English   中英

將值注入Jackson轉換器/解串器

[英]Inject value into Jackson converter/deserializer

我正在從Ruby應用程序將舊版API移植到Java,該應用程序充分利用了無需靜態輸入的優勢。

在這種情況下,API從JSON主體接受user_id ,它可以是數字用戶ID或字符串"me" (在保存到數據庫之前,應將其轉換為發出請求的用戶的ID)。 該方法如下所示:

@PUT
@Path("{key}")
@UnitOfWork
public Response getMyObjByKey(@PathParam("key") String key, MyObj myObj) {
    myObjDAO.save(myObj);
}

我有一個轉換器,我想看起來像這樣:

public class UserIdConverter extends StdConverter<String, Integer> {

    @Inject
    @AuthUser
    protected AuthenticatedUser user;

    public Integer convert(String strUserId) {
        // if strUserId is "me"
        return user.getId();
    }
}

當然,由於...與導致usernull的生命周期有關,因此這是行不通的。

我的問題是:有沒有辦法讓我訪問轉換器中的用戶對象?

據我所知,在反序列化期間無法訪問User 如果收到String “ me”,請嘗試使用自定義反序列化器,並將指示int用作id。 就像是:

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;
    }

}

然后在MyObj類中放置@JsonDeserialize(using = MyObjDeserializer.class)以使用您自己的反序列化器。

現在,如果id為“ -1”,則可以在resource方法中獲取用戶自己的id,如下所示:

@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);
}

希望這有效:)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM