当前位置: 首页 > 知识库问答 >
问题:

如何使Jackson不写入@GeneratedValue字段?[副本]

施阳曜
2023-03-14

我正在以以下方式使用JPA、Jackson和JAX-RS。

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

@Entity
public class Person {

    @Id
    @GeneratedValue
    private long id;

    private String name;
    private int age;

    public long getId() {
        return id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public Person() {
    }

    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    @Override
    public String toString() {
        return "Person [id=" + id + ", name=" + name + ", age=" + age + "]";
    }
}

这个类没有id的setter,因为它是自动生成的。即使我把二传手也没有区别。如果杰克逊需要的话,我不介意拥有它,但无论如何,它不应该被使用。

这是资源:

import java.io.IOException;

import javax.inject.Inject;
import javax.json.JsonObject;
import javax.ws.rs.Consumes;
import javax.ws.rs.POST;
import javax.ws.rs.Path;
import javax.ws.rs.Produces;
import javax.ws.rs.core.MediaType;
import javax.ws.rs.core.Response;

import org.codehaus.jackson.map.ObjectMapper;

import com.test.persons.entity.Person;

@Path("persons")
public class PersonResource {

    @Inject
    PersonService service;

    @POST
    @Consumes(MediaType.APPLICATION_JSON)
    @Produces(MediaType.APPLICATION_JSON)
    public Response save(JsonObject inputPerson) {
        ObjectMapper mapper = new ObjectMapper();
        Person person = null;
        try {
            person = mapper.readValue(inputPerson.toString(), Person.class);
        } catch (IOException e) {
            e.printStackTrace();
        }
        service.save(person); // calls @PersistenceContext EntityManager#persist(person)
        return Response.ok(person).build();
    }
}

问题是,inputPerson带有自己的ID,它应该被忽略,Person应该自动生成自己的ID。但是Jackson使用了inputPerson中的id,这会在JPA层中导致异常(因为@id是错误的)。

String s = mapper.writeValueAsString(person);

我确实需要id来序列化。只是没有反序列化。

共有1个答案

唐弘益
2023-03-14

您可以用@JsonIgnore注释标记字段id,这样Jackson Json将完全忽略该字段。

UPD.如果希望在反序列化对象时忽略该字段,但在序列化对象时使用该字段,@jsonproperty(access=access.read_only)可能会很有用。或者您可以尝试使用@jsonignore.注释setter

 类似资料:
  • 我已经尝试创建自定义序列化程序,但我无法在那里获得字段名。 在GSON中,我使用了,但Jackson没有这样的功能。有对等的吗?

  • 我正在尝试将数据框中的几个字段写入 JSON。数据框中的数据结构是 现在,我正试图将col1到col4字段转换为JSON,并为JSON字段命名 预期产出 我为此写了一个udf。 这就是我的结果 如您所见,它们没有分组。是否有使用UDF本身对这些行进行分组的方法。我是scala/Spark的新手,无法找到合适的udf。

  • 问题内容: 我不清楚杰克逊如何处理映射字段中的大写字母。如果有人可以帮忙,我将不胜感激。 上面是我的json,下面是我的例外… 上面是我的例外,下面是我的课… …等等 问题答案: 由于您的设置方法命名为Jackson,因此假设变量的命名是基于Java的 命名约定 (变量应以小写字母开头)。 如果您真的想要一个大写字母,请使用 setter 上的 @JsonProperty 注释(或-进行序列化-在

  • 我不清楚jackson是如何处理映射字段中的大写字母的。如果有人能帮忙,我将不胜感激。 上面是我的json,下面是我的例外。。。 上面是我的例外,下面是我的班级。。。 ... 等等

  • 知道如何根据Jackson的ObjectMapper对象和特定的Class检索给定json路径的Java类型吗? 假设我们有 Jackson的ObjectMapper我想找到一种方法,将字符串值反序列化到给定路径上由字段表示的类型的对象(或至少获取其类型),例如。 给定“/accountOwner/age”和“25”得到25(整数类型) 给定“/accountOwner/active”和“true