2

我目前正在开发一个我@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并将其绑定到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

请分享你的想法

4

1 回答 1

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

对于 XML,您有 JAXB。对于 JSON,您可以使用从JacksonGson的任何内容。

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

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

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
    }
}
于 2013-01-15T19:11:19.403 回答