gpt4 book ai didi

java - 哪些库可用于将对象表示形式转换为表示层中的 JSON/XML?

转载 作者:行者123 更新时间:2023-11-30 11:36:53 24 4
gpt4 key购买 nike

我目前正在开发一个 Web 项目,我的 @Entity 看起来像

@Entity
@Table(name = "variable")
@XmlRootElement
public class Variable {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private long id;

@Column(unique = true, nullable = false)
private String name;

@Column
@Enumerated(EnumType.STRING)
private VariableType type;

@Column(nullable = false)
private String units;

@Column
private String description;

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "created_on", nullable = false)
private Date createdOn;

@Temporal(TemporalType.TIMESTAMP)
@Column(name = "retired_on", nullable = true)
private Date retiredOn;

@Column(nullable = false)
private boolean core;
}

为了将此对象转换为 JSON,我将我的实体与 @XmlRootElement 连接起来,将其绑定(bind)到 JAXB

我的 REST 调用方法看起来像

    @GET
@Produces(MediaType.APPLICATION_JSON)
public Response getVariables() {
return Response.ok(variableManager.getVariables()).build();
}

这种方法有一些问题:

  1. 它将持久性与表示层紧密结合。如果后端发生某些变化,它会在表示层上导致/暴露相同的东西。不理想
  2. 表示层上的返回数据可能比在这种情况下不可行的实体数据更少/更多(另一个对象的组合)

在一个典型的web应用层中,通常有3层

presentation/
business/
persistence/

定义表示、将对象转换为 JSON/XML 的决定应该在表示层。我正在寻找可以将我的对象转换为 XML/JSON 而无需使用 @XmlRootElement

将它们绑定(bind)到持久层的方法

请分享你的想法

最佳答案

  1. 在 Web 应用程序中,您指定的三个层(表示层、业务层和持久层)都依赖于它下面的层。业务层类使用来自持久层的服务。演示服务使用业务服务。他们还可以访问持久性服务。如果您碰巧遇到业务对象,则不可避免地必须更改演示文稿中使用它的任何服务。
  2. 如果您想混合不同类型的对象,您很可能必须使用自己的序列化程序。

对于 XML,您有 JAXB。对于 JSON,您可以使用 Jackson 中的任何内容至 Gson .

我相信您正在使用的 JAX-RS 使用 Jackson 将返回的对象序列化为 JSON。

如果您不想使用只会在表示层中使用的 XML 和 JSON 注释来注释您的 Variable 类,您可以提取类的接口(interface),即。使用 getter 方法创建一个接口(interface) VariableInterface。让您的 Variable 类实现它并仅使用 JPA 注释对其进行注释。这些进入您的业务层。在您的演示文稿中,创建一个实现 VariableInterface 的类 PresentationVariable。这样,依赖关系就从表示到业务。然后,您使用 JSON/XML 映射注释来注释您的 PresentationVariable。您在演示文稿中的逻辑必须通过构造函数或实用程序方法将您的 Variable 转换为 PresentationVariable,然后您可以返回它。

package business;

public interface VariableInterface {
long getId();
String getName();
//more
}

@Table
public class Variable implements VariableInterface {
@Id
private long id;
@Column
private String name;
public long getId() {
return id;
}
public long getName() {
return name
}
}

package presentation;

import business.VariableInterface;

public class PresentationVariable implements VariableInterface {
@XmlElement
private long id;
@XmlElement
private String name;
public long getId() {
return id;
}
public long getName() {
return name
}
}

关于java - 哪些库可用于将对象表示形式转换为表示层中的 JSON/XML?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14344978/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com