SSM续(全局异常处理与跨域CORS)
**前言:**本教程是接上一个教程的延续,补齐了全局异常处理与跨域CORS,开发更加的方便
如果对SSM项目还不太熟悉的同学,可以看我上一篇文章《2025最新SSM整合教程从0 ~ 1 就算cv也可成功运行》
地址:https://blog.csdn.net/hgz3315867391/article/details/148906698?spm=1011.2415.3001.5331
最终项目结构
一、自定义全局异常类
这个类需要继承 RuntimeException
@Getter
public class GlobalException extends RuntimeException {
/**
* 异常错误码
*/
private final Integer errorCode;
public GlobalException(int errorCode, String message) {
super(message);
this.errorCode = errorCode;
}
}
定义用户异常类,这个类是继承GlobalException类的,用来处理用户的异常
/**
* 用户信息异常类
*/
public class UserInfoException extends GlobalException {
public UserInfoException(int errorCode, String message) {
super(errorCode, message);
}
}
二、新建异常处理器
真正来说是可以直接复制的,如果你们也出现了日志无法使用的异常,就粘贴个jar包
注意!!如果是上次打的工件一定要重新把新的依赖添加进去
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>2.0.17</version>
</dependency>
异常处理器
import com.hgz.ssmdemo.common.ResultVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@RestControllerAdvice("com.hgz.ssmdemo.web.controller")
@Slf4j
public class GlobalExceptionAdvice {
@ExceptionHandler(GlobalException.class)
public ResultVO handleGlobalException(GlobalException e) {
log.error(e.getMessage(), e);
ResultVO vo = new ResultVO();
vo.setCode(e.getErrorCode());
vo.setMessage(e.getMessage());
return vo;
}
@ExceptionHandler(Exception.class)
public ResultVO handleGlobalException(Exception e) {
log.error(e.getMessage(), e);
ResultVO vo = new ResultVO();
vo.setCode(500);
vo.setMessage("服务器繁忙,请稍后尝试");
return vo;
}
}
三、修改UserServiceImpl中的异常为我们自定义的异常
修改一下UserServiceImpl的异常就可以了,很简单
import com.hgz.ssmdemo.common.exceptions.user.UserInfoException;
import com.hgz.ssmdemo.entity.User;
import com.hgz.ssmdemo.mapper.UserMapper;
import com.hgz.ssmdemo.service.UserService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
@RequiredArgsConstructor
public class UserServiceImpl implements UserService {
/**
* 用户mapper
*/
private final UserMapper userMapper;
@Override
public void saveUser(User user) {
try {
userMapper.saveUser(user);
} catch (Exception e) {
throw new UserInfoException(1001,"添加用户失败,请稍后重试");
}
}
@Override
public void delete(Integer userId) {
try {
userMapper.deleteUser(userId);
} catch (Exception e) {
throw new UserInfoException(1002,"删除用户失败,请稍后重试");
}
}
@Override
public void updateUser(User user) {
try {
userMapper.updateUser(user);
} catch (Exception e) {
throw new UserInfoException(1003,"修改用户失败,请稍后重试");
}
}
@Override
public User getByUserid(Integer userId) {
try {
return userMapper.getUserById(userId);
} catch (Exception e) {
throw new UserInfoException(1004,"获取用户信息失败,请稍后重试");
}
}
@Override
public List<User> listUser() {
try {
return userMapper.listUser();
} catch (Exception e) {
throw new UserInfoException(1005,"获取所有用户信息失败,请稍后重试");
}
}
}
四、设置跨域请求
设置跨域请求只需要再MvcConfig.java中重写一个方法就可以了
@Configuration
// 开启 Spring MVC 的核心配置功能
@EnableWebMvc
public class MvcConfig implements WebMvcConfigurer {
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
// 将无法处理的请求交给默认的servlet处理器来处理
configurer.enable();
}
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("*")
.allowedMethods("*")
.allowedHeaders("*")
.exposedHeaders("*");
}
}
五、测试原生html
我已经放在我的git仓库中了
地址:https://gitee.com/addmdxwg/ssm-configuration-tutorial