徐霄龙z 2024-04-17 15:39 采纳率: 50%
浏览 4
已结题

springboot controller和service层的写法

#想问大佬们个问题,我写代码老是controller层直接写成这样

@GetMapping("/searchPhone")
    public MyResult searchPhone(String phone){
        return corpInfoService.searchPhone(phone);
    }

service层直接写成这样

public MyResult searchPhone(String phone) {
        // 切换数据源
        DatasourceUtil.changeDb(DatasourceContext.me().getDbName());

        LambdaQueryWrapper<CorpInfo> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(CorpInfo::getPhone,phone);

        CorpInfo corpInfo = this.baseMapper.selectOne(queryWrapper);


        if (ObjectUtil.isNotEmpty(corpInfo)){
            return MyResult.error("手机号已登记");
        }
        return MyResult.success();
    }

今天发现好像写错了别人controller层

@PostMapping("/dict/edit")
    @Idempotent
    @OperateLog(logName = "项目基础字典-编辑", opType = OpTypeEnum.EDIT, sortNum = 5)
    public MyResult orgTypeEdit(@RequestBody ProDictEntity proDict) {
        proDictService.edit(proDict);
        return MyResult.success();
    }

service层

public void edit(ProDictEntity proDict) {
        // 切换数据源
        DatasourceUtil.changeDb(DatasourceContext.me().getDbName());
        // 根据id查询信息
        ProDictEntity oldProDict = this.queryEntity(proDict.getId());
        // 获取参数
        String oldDictCode = oldProDict.getDictCode();
        String newDictCode = proDict.getDictCode();

        // 判断
        if (!oldDictCode.equals(newDictCode)) {
            throw new MyException(ProDictExceptionEnum.DICT_CODE_JINZHI_EDIT);
        }

        // 校验参数
        checkParam(proDict, true);
        // 更新
        this.updateById(proDict);
    }

我的写法是不是有问题,但是第二种的法controller层都返回success了,result的类的error都没用了,我不理解!所以到底改咋写,第二种是直接当异常抛出去,还想知道异常都什么情况下用抛异常啊

  • 写回答

5条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-04-17 15:39
    关注

    引自免费微信小程序:皆我百晓生

    你的代码实现方式在某些方面可以优化一下。首先,让我们讨论一下服务层(Service)和控制器层(Controller)的最佳实践。

    1. 控制器层(Controller) 控制器主要负责处理HTTP请求并转发给相应的业务逻辑处理方法。它应该关注于请求的验证、路由分发以及简单的数据转换。对于返回结果,建议使用统一的响应格式,例如MyResult,以封装业务状态和消息。在这种情况下,你应该将错误处理和成功处理分开,而不是仅仅返回一个固定的"success"。

    改进后的Controller代码:

    @GetMapping("/searchPhone")
    public MyResult searchPhone(@RequestParam String phone) {
        try {
            return corpInfoService.searchPhone(phone);
        } catch (BizException e) {
            return MyResult.error(e.getCode(), e.getMessage());
        }
    }
    
    @PostMapping("/dict/edit")
    @Idempotent
    @OperateLog(logName = "项目基础字典-编辑", opType = OpTypeEnum.EDIT, sortNum = 5)
    public MyResult orgTypeEdit(@Validated @RequestBody ProDictEntity proDict) {
        proDictService.edit(proDict);
        return MyResult.success();
    }
    
    1. 服务层(Service) 服务层应专注于业务逻辑和数据操作。在处理复杂业务规则时,可以考虑抛出自定义异常。这有助于将业务逻辑与异常处理分离,并且可以使代码更易于测试和维护。

    改进后的Service代码:

    @Service
    public class CorpInfoService {
    
        public MyResult searchPhone(String phone) {
            // 切换数据源
            DatasourceUtil.changeDb(DatasourceContext.me().getDbName());
    
            LambdaQueryWrapper<CorpInfo> queryWrapper = new LambdaQueryWrapper<>();
            queryWrapper.eq(CorpInfo::getPhone, phone);
    
            CorpInfo corpInfo = baseMapper.selectOne(queryWrapper);
    
            if (ObjectUtils.isNotEmpty(corpInfo)) {
                throw new BizException(BizErrorCode.HAS_REGISTERED_PHONE, "手机号已登记");
            }
    
            return MyResult.success();
        }
    }
    
    @Service
    public class ProDictService {
    
        public void edit(ProDictEntity proDict) throws BizException {
            // 切换数据源
            DatasourceUtil.changeDb(DatasourceContext.me().getDbName());
            
            // 根据id查询信息
            ProDictEntity oldProDict = queryEntity(proDict.getId());
            
            // 获取参数
            String oldDictCode = oldProDict.getDictCode();
            String newDictCode = proDict.getDictCode();
            
            // 判断
            if (!oldDictCode.equals(newDictCode)) {
                throw new BizException(ProDictExceptionEnum.DICT_CODE_JINZHI_EDIT, "字典编码不允许修改");
            }
            
            // 校验参数
            checkParam(proDict, true);
            
            // 更新
            updateById(proDict);
        }
    }
    
    1. 自定义异常处理 创建一个自定义的异常基类,例如BizException,用于封装业务错误码和消息。同时,可以在全局配置中设置异常处理器来处理这些自定义异常。

    自定义异常类示例:

    public class BizException extends RuntimeException {
        private int code;
        private String message;
    
        public BizException(int code, String message) {
            super(message);
            this.code = code;
            this.message = message;
        }
    
        // Getters and setters
    }
    

    全局异常处理器配置:

    @ControllerAdvice
    public class GlobalExceptionHandler {
    
        @ExceptionHandler(BizException.class)
        @ResponseBody
        public MyResult handleBizException(BizException ex) {
            return MyResult.error(ex.getCode(), ex.getMessage());
        }
    
        // 其他异常处理...
    }
    
    1. MyResult 类 如果你还没有创建MyResult类,可以创建一个包含状态码和消息的对象,方便在不同层次返回统一的结果格式。

    MyResult 类示例:

    public class MyResult<T> {
        private int code;
        private String message;
        private T data;
    
        // 构造函数、getter和setter...
    }
    

    这样的设计使得代码结构更加清晰,便于理解和维护。异常处理也更具可读性,可以根据具体的业务场景选择是否抛出异常,也可以在Controller层捕获异常并转化为统一的返回格式。

    本回答被专家选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(4条)

报告相同问题?

问题事件

  • 系统已结题 5月14日
  • 专家已采纳回答 5月6日
  • 创建了问题 4月17日

悬赏问题

  • ¥15 高通uboot 打印ubi init err 22
  • ¥20 PDF元数据中的XMP媒体管理属性
  • ¥15 R语言中lasso回归报错
  • ¥15 网站突然不能访问了,上午还好好的
  • ¥15 有没有dl可以帮弄”我去图书馆”秒选道具和积分
  • ¥15 semrush,SEO,内嵌网站,api
  • ¥15 Stata:为什么reghdfe后的因变量没有被发现识别啊
  • ¥15 振荡电路,ADS仿真
  • ¥15 关于#c语言#的问题,请各位专家解答!
  • ¥15 这个如何解决详细步骤