如何通过实体之间的控制器和服务的方法,在春天访问用户的数据?

0

的问题

让我们来考虑一个弹簧引导(春天访问用户的数据)应用程序的控制器和服务,如以下例子:

  • processEntity() 获取一个对象从数据库和流程/更新。
  • publishEntity() 是一个单独的方法,再次取的对象从数据库,并将其发布到另一个系统。 它需要的"最新的"国家的实体的数据库。

我发现了几个博文和文章,其建议 不要操作实体在控制器,即范围之外的事务。 所以我的课程是这样的:

@Service
public SomeService {

    @Transactional
    public void processEntity(long id) {
        final SomeEntity someEntity = entityRepository.findById(id);
        // process entity...
        entityRepository.save(someEntity);
    }

    @Transactional(readOnly = true)
    public void publishEntity(long id) {
        final SomeEntity someEntity = entityRepository.findById(id);
        // publish entity to another system...
    }
}

@RestController
public SomeController {

    @GetMapping(path = "/api/entity")
    public ResponseEntity<Void> getEntity() {
        someService.processEntity(1);
        someService.publishEntity(1);
    }
}

是这种方法合理吗? 或者是有更好的模式为这样使用的情况下? 它会被认为是"不好做法"如果 processEntity 返回该实体本身的控制器,它穿它 publishEntity?

java spring spring-boot spring-data-jpa
2021-11-23 18:05:30
2

最好的答案

2

回实体和接收实体在你们的控制通常是一个不好的做法和共同的来源问题(不要误会我,它实际工作,但是,除非你使用情况都是如此简单,你将最有可能面对一些约束,而这样做). 你应该使用 交互 反而,这将是一个相似的类实体,但可以代表多次意见,从你的领域模型(实体在你的情况)。

有很多原因使用交互:

  • 它允许一个分离的关切问题之间的领域模型和你的"公众"的模式,允许你改变一个不需要改变。
  • 它可以让你轻松有多欣赏你的实体而不需要包括杰克逊,魔术说明,包括或排除某些属性,在你的实体类别。

你可以阅读与此有关的更多信息,请参见下面的网上资源: https://www.baeldung.com/java-dto-pattern.


如果你决定用交互,也考虑使用映如下:

我真的不喜欢用他们的(我喜欢做的映射在我自己的),但是你可能找到他们有用的。 映射可以是在业务层本身或在控制层。 有优点和缺点,对每一个办法,但是我会说它真的来到你的喜好。

2021-11-23 19:00:28
2

它建议使用也可与检的对象之间的控制器和服务。 在你决定删除的数据库,并使用一些外部系统,后来,然后控制层不会受到影响。

2021-11-23 18:22:21

其他语言

此页面有其他语言版本

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
ไทย
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................