Java 服务层中的DTO-REST API

Java 服务层中的DTO-REST API,java,hibernate,rest,jersey,Java,Hibernate,Rest,Jersey,我正在基于Jersey&Hibernate构建一个REST API服务,它包含以下层: 模型中的每个实体在服务层(接口)中都有自己的服务。 如上所述,DTO从服务层传递到端点层。 以下是PolicySetService接口: public interface PolicySetService extends BaseService<PolicySet, PolicySetDao> { String createPolicySet(String accountId, Poli

我正在基于Jersey&Hibernate构建一个REST API服务,它包含以下层:

模型中的每个实体在服务层(接口)中都有自己的服务。 如上所述,DTO从服务层传递到端点层。 以下是PolicySetService接口:

public interface PolicySetService extends BaseService<PolicySet, PolicySetDao> {
    String createPolicySet(String accountId, PolicySetDto policySet) throws PolicyException;
    void updatePolicySet(String accountId, String policySetId, PolicySetDto newPolicySet) throws PolicyException;
    PolicySetDto getPolicySetDto(String accountId, String policySetId) throws PolicyException;
    void deletePolicySet(String accountId, String policySetId) throws PolicyException;
}
public interface EvaluationService extends BaseService<Evaluation, EvaluationDao> {
    EvaluationDto createEvaluation(String accountId, String policySetId, EvaluationRequestData requestData) throws PolicyException;
}
公共接口PolicySetService扩展了BaseService{
String createPolicySet(String accountId,PolicySetDto policySet)抛出PolicyException;
void updatePolicySet(String accountId、String policySetId、PolicySetDto newPolicySet)抛出PolicyException;
PolicySetDto getPolicySetDto(字符串accountId,字符串policySetId)抛出PolicyException;
void deletePolicySet(String accountId,String policySetId)抛出PolicyException;
}
现在让我们看一下EvaluationService接口:

public interface PolicySetService extends BaseService<PolicySet, PolicySetDao> {
    String createPolicySet(String accountId, PolicySetDto policySet) throws PolicyException;
    void updatePolicySet(String accountId, String policySetId, PolicySetDto newPolicySet) throws PolicyException;
    PolicySetDto getPolicySetDto(String accountId, String policySetId) throws PolicyException;
    void deletePolicySet(String accountId, String policySetId) throws PolicyException;
}
public interface EvaluationService extends BaseService<Evaluation, EvaluationDao> {
    EvaluationDto createEvaluation(String accountId, String policySetId, EvaluationRequestData requestData) throws PolicyException;
}
公共接口评估服务扩展了BaseService{
EvaluationDto createEvaluation(String accountId、String policySetId、EvaluationRequestData requestData)抛出PolicyException;
}
我一直在阅读一个服务(比如EvaluationService)调用另一个服务(比如PolicySetService)以获取域模型实体(而不是从EvaluationService直接调用PolicySet Dao)的最佳实践 在我的例子中,EvaluationService实现应该使用PolicySetService来获取PolicySet实体(而不是DTO),以便在持久化评估实体之前执行一些业务逻辑。 目前,PolicySetService返回DTO,我需要将其转换为EvaluationService中的真实PolicySet实体。 请注意,服务应该只向更高层公开DTO(但我需要一些如何在服务层内公开实体域模型,也就是在服务之间) 实现这一点的最佳架构是什么? 我是否应该为服务创建另一个“内部”服务接口以便彼此通信?
有更好的体系结构吗?

除非有充分的理由,否则不要再创建一组DTO。对于应用程序各层之间的通信,您可以使用您已有的实体或DTO。嗨@CássioMazzochiMolin感谢您的回复。我必须使用DTO作为从客户端获取的数据,并且响应的数据不同于域模型实体。在这种情况下,为响应对象设计DTO将是一个明智的选择。我已经在这方面谈到了类似的情况。这可能对你有用。@CássioMazzochiMolin我读了你提供的答案。它非常好,详细介绍了为什么以及如何使用DTO。但是,它并没有回答我的问题,即什么是最好的架构,服务之间可以相互对话,但在域模型实体中,而不是在DTO中。。。目前,我的服务接口获取并返回DTO,而当一个服务与另一个服务对话时(即在服务层内通信时),需要域模型实体,而不是DTO。除非您确实有充分的理由,否则不要创建另一组DTO。对于应用程序各层之间的通信,您可以使用您已有的实体或DTO。嗨@CássioMazzochiMolin感谢您的回复。我必须使用DTO作为从客户端获取的数据,并且响应的数据不同于域模型实体。在这种情况下,为响应对象设计DTO将是一个明智的选择。我已经在这方面谈到了类似的情况。这可能对你有用。@CássioMazzochiMolin我读了你提供的答案。它非常好,详细介绍了为什么以及如何使用DTO。但是,它并没有回答我的问题,即什么是最好的架构,服务之间可以相互对话,但在域模型实体中,而不是在DTO中。。。目前,我的服务接口获取并返回DTO,而当一个服务与另一个服务对话时(意味着在服务层内部通信时),需要域模型实体,而不是DTO。