当前位置: 首页 > 知识库问答 >
问题:

如果Service返回的DTO不是实体,如何在Spring Boot中处理其他服务中的DTO?

冯元徽
2023-03-14

阅读本文后,我将服务方法实体的返回值更改为DTO。

但我对下面的情况有点困惑。

实体A

实体B

然后,如果服务B需要访问实体A,那么调用服务A中的方法。因为该方法的结果是DTO,而不是实体,所以我很难在服务B中处理DTO A。

我应该在服务B中调用存储库A吗?或者我应该调用Service B中的Service A并使用模型映射器将dto隐藏到Service B中的实体?

// Controller code
@RestController 
public FooDTO getSomeFoo(){    
    return new FooDTO(service.getFoo()) 
}  


// Service code
@Service 
public Foo getFoo(){     
    return repository.find(~) 
}

共有1个答案

濮赤岩
2023-03-14

在我看来,除非您真的希望保护您的实体在相应服务之外的其他地方被更改,否则我将避免在服务层内的调用中使用DTO。这意味着可以在应用程序中的其他服务调用的方法中返回实体,除非您真的希望(很可能)对应用程序进行过度设计。已经说过,您应该只在控制器层调用的方法中返回DTO,以便在RESTAPI中使用它们(假设您有一个)。当然,这需要规范,并确保您不调用控制器上的方法,这些方法本应仅由服务调用。有一种体系结构试图解决这个问题(如果您想了解更多有关它的信息)--

我应该调用服务B中的html" target="_blank">存储库A吗?

绝对不是。你永远不应该这样做(永远不可能是一个强有力的词,但你至少应该努力避免),否则你的代码将变成一团混乱,没有任何结构。

 类似资料:
  • 特别是如果信号处理需要调用一个/一些活动,我如何实现? 我试图返回数据或异常,但它不起作用。 无法从信号方法返回数据。抛出异常将阻止工作流执行。

  • 问题内容: 我试图在这里得到两个非常相似的问题的答案: 我应该将实体转换为Repository对象内的DTO并将其返回到服务层吗? 要么 从存储库层返回DTO对象可以吗? 现在,我被困在Servlet(服务层)中,例如,尝试从中检索所有对象: 带注释的类在哪里- 这似乎是我不应该做的第一件事,因为服务层现在知道一个非常低级的对象,恕我直言违反了在每一层抽象我的数据的尝试。 如果我将每个实例都转换为

  • 我在这里试图得到两个非常相似的问题的答案: 我是否应该在存储库对象中将实体转换为DTO,并将其返回到服务层? 其中是一个注释类-这似乎是我不应该做的第一件事,因为服务层现在知道了一个非常低级别的对象,它违反了在每一层抽象数据的尝试。 如果我将每个转换为,情况就不是这样了--但是我应该这样做吗? 基本改变: 但这对我来说不是最好的解决办法…我在这里能做什么? 要提到的一件重要事情是,它来自GWT项目

  • 问题内容: 我的公司拥有数千个现有的xml Web服务,并开始为新项目采用AngularJs。 http://angularjs.org/上的教程专门使用json服务。看起来他们在控制器中进行了服务调用,解析了生成的JSON,并将生成的对象直接传递给视图。 我该如何处理XML?我看到四个选项: 解析它,然后将DOM对象直接传递到UI(view)。 在服务器端围绕我的XML服务放置一个JSON包装器

  • 我的结账代码 在浏览器调试中,我看到一篇文章https://www.paypal.com/smart/api/order/23H57866L56525306/capture 我从贝宝那里得到了答案 我什么时候去https://developer.paypal.com/docs/api/orders/v2/#error-交易被拒绝了,不知道该怎么办。

  • 我希望在spring boot中返回类似以下内容的json响应: 我的RestController如下所示 但我得到的反应是这样的