Spring MVC + Jackson:字段未被序列化
Spring MVC + Jackson: field not being serialized
我正在尝试使用 REST API 进行简单的往返,将实体存储到数据库中,然后 return 存储实体。
向下运行正常,实体被存储并正确 returned 到 REST 控制器。但是,当我 return 它时,Jackson 似乎没有正确序列化它,因为 "name" 属性不包括在内。
这是实体:
@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> {
}
returned JSON 是:
{"id":12,"version":1}
我的 "name" 属性在哪里? Is 设置在由 REST 控制器 return 编辑的变量中。
我找到了诀窍:MyEntity 需要为必须显示的 属性 获取 public。使用 DTO 模式的一个很好的理由。
您可以将其保留为一个字段,并根据需要用 @JsonProperty
注释该字段。
回应您的 "I don't want to have my Entity " 肮脏的“”评论:Jackson 允许使用所谓的 Mixins。它们允许您在 class 本身之外为 class 定义注释。在您的情况下,它可能看起来像这样:
public abstract class MyEntityMixin {
@JsonProperty
private String name;
}
我正在尝试使用 REST API 进行简单的往返,将实体存储到数据库中,然后 return 存储实体。 向下运行正常,实体被存储并正确 returned 到 REST 控制器。但是,当我 return 它时,Jackson 似乎没有正确序列化它,因为 "name" 属性不包括在内。
这是实体:
@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> {
}
returned JSON 是:
{"id":12,"version":1}
我的 "name" 属性在哪里? Is 设置在由 REST 控制器 return 编辑的变量中。
我找到了诀窍:MyEntity 需要为必须显示的 属性 获取 public。使用 DTO 模式的一个很好的理由。
您可以将其保留为一个字段,并根据需要用 @JsonProperty
注释该字段。
回应您的 "I don't want to have my Entity " 肮脏的“”评论:Jackson 允许使用所谓的 Mixins。它们允许您在 class 本身之外为 class 定义注释。在您的情况下,它可能看起来像这样:
public abstract class MyEntityMixin {
@JsonProperty
private String name;
}