写在controller与写在service中的区别。

本文讨论了在软件开发中Controller与Service层的区别。建议将船舶租用信息确认等事务操作放在Service层实现,以便进行错误回滚;而Controller层主要用于对象封装及简单的查询操作。

写在controller与写在service中的区别。
船舶租用信息的确认,不要放controller,要放service。
在service中执行的是事务,(插入、更新、删除)出现错误可以回滚。只有查询可以放在controller,不过最好也放在service。

不带@ResponseBody的 返回页面。
@带ResponseBody的 返回数据。
在controller中一般完成对对象的封装,这样在service中只需要处理对象。

转载于:https://www.cnblogs.com/CESC4/p/7111941.html

### 参数校验放在 Controller 层的优劣 #### 优点 - **职责分离明确**:Controller 层主要负责接收请求、校验参数、返回响应,将参数校验放在此层,符合其接收和初步处理请求的职责定位,使各层职责更加清晰。例如,一个接收用户注册信息的接口,在 Controller 层就可以对用户输入的用户名、密码等格式进行基本校验,保证传入 Service 层的数据是符合基本要求的。 - **减少 Service 层负担**:避免 Service 层处理过多业务逻辑无关的参数校验代码,使其更专注于核心业务逻辑的处理。如在一个电商系统中,订单创建的 Service 层主要负责订单的业务逻辑,如库存检查、价格计算等,而订单参数的格式校验放在 Controller 层,可让 Service 层代码更简洁。 - **统一异常处理**:可以结合 @ControllerAdvice + @ExceptionHandler 进行全局的 Controller 层异常处理,对参数校验失败的异常进行统一捕获和处理,减少模板代码,提升扩展性和可维护性。当使用 @Validated 校验器注解进行参数校验时,若校验失败,Spring 会抛出 MethodArgumentNotValidException 异常,可在全局异常处理类中统一处理该异常并返回错误信息[^1][^4]。 #### 缺点 - **缺乏业务逻辑感知**:Controller 层可能无法深入了解业务逻辑中对参数的具体要求,只能进行一些基本的格式校验。例如,在一个金融系统中,对于用户转账金额的校验,除了格式校验,还需要根据用户账户余额、转账限额等业务规则进行校验,这些业务相关的校验在 Controller 层难以完成。 - **重复代码问题**:如果多个 Controller 方法有相似的参数校验逻辑,可能会导致代码重复。例如,多个接口都需要对用户 ID 进行非空校验,在每个方法中都编相同的校验代码,会增加代码的冗余度。 ### 参数校验放在 Service 层的优劣 #### 优点 - **结合业务逻辑**:Service 层负责处理业务逻辑,能够根据具体的业务规则对参数进行更深入的校验。如在一个社交系统中,用户发布动态时,除了基本的格式校验,还需要根据用户的权限、动态内容是否包含敏感词等业务规则进行校验,这些校验在 Service 层进行更为合适。 - **避免重复校验**:对于一些依赖业务数据的校验,在 Service 层进行可以避免在多个 Controller 方法中重复进行。例如,在一个订单系统中,对于商品库存的校验,在创建订单、修改订单等操作中都需要进行,将该校验放在 Service 层可以避免在多个 Controller 方法中重复编库存校验代码。 #### 缺点 - **职责不清晰**:会使 Service 层承担过多的参数校验职责,导致其核心业务逻辑不够清晰,增加了代码的复杂度和维护难度。例如,一个用户信息管理的 Service 层,既要处理用户信息的增删改查业务逻辑,又要进行大量的参数校验,会使代码结构变得混乱。 - **异常处理复杂**:Service 层的异常处理会变得更加复杂,因为不仅要处理业务逻辑异常,还要处理参数校验异常。例如,在一个电商系统的商品购买 Service 层,既要处理库存不足等业务异常,又要处理商品 ID 无效等参数校验异常,增加了异常处理的难度和代码量。 ```java // Controller 层示例 import org.springframework.validation.annotation.Validated; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RestController; import javax.validation.Valid; @RestController @Validated public class UserController { @PostMapping("/register") public String register(@Valid @RequestBody User user) { // 调用 Service 层方法 return "注册成功"; } } // Service 层示例 import org.springframework.stereotype.Service; @Service public class UserService { public void processUser(User user) { // 进行业务逻辑处理 } } // 用户实体类 import javax.validation.constraints.NotBlank; public class User { @NotBlank(message = "用户名不能为空") private String username; @NotBlank(message = "密码不能为空") private String password; // getter 和 setter 方法 public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值