【问题标题】:Spring MVC + Jackson: field not being serializedSpring MVC + Jackson:字段未序列化
【发布时间】:2015-02-01 11:42:00
【问题描述】:

我正在尝试使用 REST API 进行简单的往返,从而将实体存储到数据库中,然后返回存储的实体。 向下工作正常,实体被存储并正确返回到 REST 控制器。但是,当我返回它时,Jackson 似乎序列化它不正确,因为“名称”属性不包括在内。

这是实体:

@Entity
@Configurable
public class MyEntity extends IdentifiableEntity {

    private String name;

    protected MyEntity() {
    };

    public MyEntity(String name) {
        this.name = name;
    }
}

和扩展实体:

@Configurable
@Inheritance(strategy = InheritanceType.JOINED)
@Entity
public abstract class IdentifiableEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "id")
    private Long id;

    @Version
    @Column(name = "version")
    private Integer version = 1;

    public String toString() {
        return ReflectionToStringBuilder.toString(this,
                ToStringStyle.SHORT_PREFIX_STYLE);
    }

    public Long getId() {
        return this.id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Integer getVersion() {
        return this.version;
    }

    public void setVersion(Integer version) {
        this.version = version;
    }
}

REST 控制器是:

@RestController
@RequestMapping("/service")
public class Service {

    @RequestMapping(value = "/public/{name}", method = RequestMethod.GET)
    public MyEntity storeEntityPublic(@PathVariable String name) {
        System.out.println("Hello " + name
                + ", I am saving on the db. (PUBLIC)");
        MyEntity saved = controller.saveEntity(name);

        return saved;
    }
}

然后是我的业务逻辑:

@Service
public class LogicController {
    @Autowired
    private MyEntityRepository myEntityRepository;

    public MyEntity saveEntity(String name) {
        MyEntity cg = new MyEntity(name);

        return myEntityRepository.save(cg);
    }
}

我正在使用 Spring 存储库:

@Repository
public interface MyEntityRepository extends JpaSpecificationExecutor<MyEntity>,
        JpaRepository<MyEntity, Long> {

}

返回的 JSON 是:

{"id":12,"version":1}

我的“姓名”属性在哪里? Is 设置在 REST 控制器返回的变量中。

【问题讨论】:

  • 没有name 属性,只有name 字段。属性由 get/set 方法标识。这是 Java Beans 规范中指定的方式。

标签: json spring spring-mvc jackson


【解决方案1】:

我找到了诀窍:MyEntity 需要对必须显示的属性进行公共获取。使用 DTO 模式的充分理由。

【讨论】:

  • 我建议特别将 Groovy 用于简单的数据对象,因为它会为您创建 getter 和 setter。
  • @chrylis 你的意思是它会生成代码?或者,在运行时,它会扩展我的类?
  • Groovy 在编译时生成 getter 和 setter 作为类的一部分。
【解决方案2】:

针对您的“我不想让我的实体“脏””评论:Jackson 允许使用所谓的Mixins。它们允许您在类本身之外为您的类定义注释。在您的情况下,它可能如下所示:

public abstract class MyEntityMixin {
  @JsonProperty
  private String name;
}

【讨论】:

    【解决方案3】:

    如果您愿意,可以将其保留为字段并使用@JsonProperty 注释该字段。

    【讨论】:

    • 谢谢。这可能是使用 DTO 时的解决方案:我不想让我的实体“脏”。
    • 当然,就我而言,这是纯粹的偏好。如果您不想使用外部 API 污染您的模型,您可以使用带有 JaxbAnnotationIntrospector 的 JAXB 注释
    猜你喜欢
    • 2011-06-28
    • 1970-01-01
    • 2015-11-19
    • 2012-08-31
    • 1970-01-01
    • 2020-01-09
    • 1970-01-01
    • 2012-05-01
    • 2011-07-30
    相关资源
    最近更新 更多