mybatis 只在Impl层加入业务逻辑 以及 has an unsupported return type: class java.lang.String解决办法案例

项目场景:

在做mybatis增删改的时候,可能会遇到这类问题UserMapper.‘ has an unsupported return type: class java.lang.String ,该错误发生在service的实现类Impl里面,是因为dao层的方法 跟service层 和实现类层Impl 方法类型不一致导致的。由于公司要求controller层简化,回溯增个项目,其实跟dao层、service层、Impl层 和controller层都有关联

问题描述:

由于公司代码规范,要求我将controller层里面不要带任何的逻辑判断,只能在controller 里面 就直接调用Service的方法 ,得到service的方法返回结果 然后返回
跟我们之前写代码的习惯不一样,我们习惯于在controller层里面加入业务和判断,在其他层里面只是简单的接口调用。以下为我之前写的一个删除用户功能(还未修改)

dao层 接口方法类型为void:

public interface UserMapper {
    //根据id删除用户
    void deleteUserById(int id);
 }

service层接口方法类型为void:

public interface IUserService {
   //根据id删除用户
   void deleteUserById(int id);

Impl层,与大家习惯一样没有如何逻辑判断:

@Service 
@Transactional(rollbackFor = Exception.class) //开启事务管理
public class UserServiceImpl implements IUserService {
    @Autowired
    UserMapper userMapper;
    
    @Override //重写方法
    public void deleteUserById(int id) {
        userMapper.updateUserById(id);
    }
 }

controller层,加入了许多的逻辑判断 先判断是否存在该用户,再进行操作:

@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    IUserService userService;

    @GetMapping("/deleteUserById/{id}")
    public String  deleteUserById(@PathVariable(value = "id")  int id) {
        try {  
            //调用getUserById方法获取指定用户工号的信息
            User delUser = userService.getUserById(id);
            if (delUser.isEmpty()) {
                return "无该用户信息";
            } else {
                userService.deleteUserById(id);
                return "删除用户信息成功,删除的用户信息为" + delUser;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return "捕捉到异常,删除用户信息失败";
        }
    }
}

关于User实体类和UserMapper.xml我就没有展示了;
该用户删除功能的代码是非常普遍的,也符合大家的编程习惯,但是现在公司要求将简化controller代码,使其只返回调用方法和返回值例如:
controller层,只有一个简单方法调用返回,没有加任何的业务逻辑:

    @GetMapping("/deleteUserById/{id}")
    public String  deleteUserById(@ApiParam(value = "用户工号") @PathVariable(value = "id")  int id) {
        return userService.deleteUserById(id);

为了达到这种效果,不在controller类加入任何逻辑,,其实走了很多坑

踩的坑如下:

踩坑思路:,若将所有的逻辑业务都放在impl层里面。需要变动dao层、service层 的接口类型
即将其类型都改成String类型,方便删除用户提示消息 :String deleteUserById (int id)
此时为了在impl层加入业务逻辑,我做出了如下修改
impl层:

   @Override
   public String deleteUserById(int id) {
         // 根据getUserById获取是否存在该用户
         User delUser = userMapper.getUserById(id);
        if (delUser != null) {
        return userMapper.deleteUserById(id);
        }
        return "id不存在";
   }

emmmm 感觉没什么毛病,那么启动访问。。报错了。。报错信息就是
Mapper method ‘com.win.dfbp.information.dao.UserMapper.deleteUserById’ has an unsupported return type: class java.lang.String
返回类型不支持String类型 得解决吧。。。

解决办法

既然因为dao层的deleteUserById不支持String类型,那我们就修改方法类型;我改了dao层接口方法类型 将string 改成 int 或者void,service 层还是 String 类型,由于 impl实现service层接口,需要重写其接口方法,所以impl层的方法类型必须与service层接口类型保持一致 。以下为再修改的各层接口或者方法类型
dao层 接口方法类型为void/int:

public interface UserMapper {
    //根据id删除用户
    void deleteUserById(int id);
 }

service层接口方法类型为String :

public interface IUserService {
   //根据id删除用户
   String deleteUserById(int id);

为什么service层方法类型为String,是为了我们在进行删除功能时,可以return一个返回消息比如“删除成功”或“删除失败”。本来我们可以在controller层进行判断从而根据不同情况返回不同信息,但是之前我就说过,不要在controller层里面加入任何的逻辑判断,只能在controller层调用service方法并且放回,逻辑判断之类的放在Impl层内。所以要将service层方法类型改成String类型就是为了进行逻辑判断根据情况返回不同信息

Impl层重写service里面的deleteUserById方法,加入了逻辑判断, :

    @Override
    public String deleteUserById(int id) {
        //通过getUserById方法 获取是否存在该用户
        User delUser = userMapper.getUserById(id);
        if (delUser != null) {
            userMapper.deleteUserById(id);
            return "删除用户信息成功";
        }
        return "id不存在";
    }

在controller层中:

    @GetMapping("/deleteUserById/{id}")
    public String  deleteUserById(@ApiParam(value = "用户工号") @PathVariable(value = "id")  int id) {
        return userService.deleteUserById(id);

现在就大功告成了。。业务逻辑在Impl层 controller层只是方法调用!
有人说,那我可不可以在impl层里面 存在用户的情况下 ,直接return userMapper.deleteUserById(id) 而不是 return "删除用户信息成功" 。 在这里需要注意,因为dao层里面你定义的接口方法为int/void 但是Impl方法是String类型的,即不能直接 return userMapper.deleteUserById(id) 因为返回类型不匹配。
当然 如果dao层方法为int 你可以 return “删除信息成功” + userMapper.deleteUserById(id); 这样是成功的,但是在 “xx” 后面拼接int类型,其实没有意义。

  • 4
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值