java - 现场级反序列化不适用于 jackson

标签 java json spring-mvc json-deserialization jackson-databind

仅当我使用 Jackson 的字段级反序列化时,我才会收到 400 Bad Request 错误。如果我在类级别上进行反序列化,那么它工作得很好。我只想传递用户 ID 而不是整个用户对象,因此需要进行字段级反序列化。据我所知,解串器甚至没有被调用。我的代码如下:

模型类别:

@Entity
@Table(name = "expense")
@JsonIgnoreProperties(ignoreUnknown = true)
public class Expense implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue
private long id;

@Embedded
@AttributeOverrides({
        @AttributeOverride(name = "receiptPicture", column = @Column(name = "receipt_picture"))
})
private ExpenseDetail detail;

@ManyToOne
@JoinColumn(name = "given_by")
@JsonDeserialize(using = ExpenseGivenByDeserializer.class)
private User givenBy;

@ManyToOne
@JoinColumn(name = "given_for")
@JsonIgnore
private House givenFor;

@ManyToMany(cascade = {
        CascadeType.PERSIST,
        CascadeType.MERGE
})
@JoinTable(
        name = "users_approved_expenses",
        joinColumns = {@JoinColumn(name = "expense_id")},
        inverseJoinColumns = {@JoinColumn(name = "user_id")}
)
@JsonIgnore
private List<User> approvedUsers;

@Embedded
@JsonIgnore
private Timer timer;

//....setters and getters

解串器类:

    @Component
    public class ExpenseGivenByDeserializer extends JsonDeserializer<User> {

    @Autowired
    private UserDao userDao;

    @Override
    public User deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        ObjectCodec oc = jp.getCodec();
        JsonNode node = oc.readTree(jp);
        long id = node.get("givenBy").asLong();
        System.out.println("herer");
        return userDao.find(id);
    }
}

我发布这个:

{
    "detail" : {
        "description" : "rice 2 kg",
        "receiptPicture" : "../image/kk.jpg",
        "cost" : "1500"
    },
    "givenBy": 15
}

最佳答案

在您的解串器中,node 是您需要的值节点。 (检查node.isValueNode())。

这就够了

JsonNode node = oc.readTree(jp);
long id = node.asLong();
System.out.println("herer"); //prints!

return userDao.find(id);

关于java - 现场级反序列化不适用于 jackson ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49849718/

相关文章:

java - 类型参数的意义是什么?为什么我们需要在返回类型中添加它一次,然后在修饰符和返回类型之间添加它?

java - 如何在 Scala 中将复杂的 JSON 字符串转换为 MAP

Javascript 返回 JSON 不起作用

ruby-on-rails - 设计 + Rails 4.1 JSON API : user parameters are not wrapped

java - 在 spring-mvc 中使用抽象工厂模式时出现空指针异常

java - 为什么出于性能原因传递大字符串作为返回类型不好?

java - 使用正则表达式删除单词开头或结尾的撇号

java - Spring mvc Time 列接收 null 导致 HttpMessageNotReadableException

Spring 3 MVC-将带有前缀的请求参数映射到单个bean

java - Android sdk setText错误