我目前正在开发一个 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();
}
这种方法有一些问题:
- 它将持久性与表示层紧密结合。如果后端发生某些变化,它会在表示层上导致/暴露相同的东西。不理想
- 表示层上的返回数据可能比在这种情况下不可行的实体数据更少/更多(另一个对象的组合)
在一个典型的web应用层中,通常有3层
presentation/
business/
persistence/
定义表示、将对象转换为 JSON/XML 的决定应该在表示层。我正在寻找可以将我的对象转换为 XML/JSON
而无需使用 @XmlRootElement
请分享你的想法
最佳答案
- 在 Web 应用程序中,您指定的三个层(表示层、业务层和持久层)都依赖于它下面的层。业务层类使用来自持久层的服务。演示服务使用业务服务。他们还可以访问持久性服务。如果您碰巧遇到业务对象,则不可避免地必须更改演示文稿中使用它的任何服务。
- 如果您想混合不同类型的对象,您很可能必须使用自己的序列化程序。
对于 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/