html json 访问工程,SpringBoot:Web项目中如何优雅的同时处理Json和Html请求的异常...

在一个web项目开发中,通常都会涉及到Html和Json请求。当出现异常的时候,我们需要根据请求类型返回不同的信息。如果是Json请求,那么就返回String或者ReponseEntity类型;如果是html请求,就要返回ModelAndView的错误页面。

我们当然可以对Controller的每个接口方法抛出的异常单独处理。但这样做会导致大量的重复工作。Spring MVC为我们提供了@ControllerAdvice和@ExceptionHandler`两个注解来实现全局的异常处理。关于这两个注解的用法可以参考这里。

这解决了大部分的问题,但是如果同一个Controller中既有html又有json接口方法怎么办呢?我们当然可以拆分成两个Controller,一个包含html接口,另一个包含json接口。但是这样做不够灵活,而且我更习惯根据业务逻辑来归类接口。有没有更好的方法呢?

其实在写异常处理方法时,我们可以将请求信息作为参数传入,并根据请求类型来返回不同的数据。

public class BaseController{

private Boolean isJson(HttpServletRequest request){

String header = request.getHeader("content-type");

return header != null && header.contains("json");

}

@Override

@ExceptionHandler(BaseException.class)

public Object handleBaseException(HttpServletRequest request, baseException e) {

if(isJson(request)) {

return ResponseUtils.restResponse(

e.getCode(),

e.getMessage(),

e.getStatus()

);

} else {

ModelAndView modelAndView = initModelAndView();

if (e.getCode().equalsIgnoreCase("login_first")) {

modelAndView.setViewName("redirect:/list");

}

if (e.getCode().equalsIgnoreCase("real_name_not_set")) {

modelAndView.setViewName("redirect:/account");

}else{

modelAndView.setViewName("/404");

}

modelAndView.addObject("exception", e);

return modelAndView;

}

}

}

这里我们写了一个BaseController,并在Controller中实现了异常捕获的逻辑。isJson()通过判断请求的Content-Type是否包含json字符串来判断该请求类型。当然,更好更合适的方式是通过包头中的Accept中的信息类判断。需要注意的是handleBaseException()方法返回了Object类型,这样我们就可以根据需要返回不同类型的数据了。以后只要Contrller继承BaseController就不用再考虑异常的问题了。

但是,如果异常是在进入接口方法之前被抛出的呢。比如404,406错误,根本不会执行接口方法,因此也无法被ExceptionHandler捕获。这部分异常如何处理呢?

Spring Boot提供了一个统一的/error地址用于所有未被捕获的异常抛出。默认设置下显示的是一个whitelabel error page。

a9bcfe733713?nomobile=yes

通过实现ErrorController,我们可以定制这个错误页面。

@Controller

public class MpErrorController extends BaseController implements ErrorController {

private static final String PATH = "/error";

@RequestMapping(value = PATH)

public Object error() throws Exception {

throw new BaseException();

}

@Override

public String getErrorPath() {

return PATH;

}

}

我们希望这个error页面也根据请求的类型做出不同的逻辑处理。因此,可以直接在error()抛出BaseException异常,并且让这个Controller继承于BaseController。这样,被抛出的异常也会被handleBaseException()捕获了。

至此,我们比较优雅的实现了全局的异常处理。所有的BaseException异常处理逻辑都集中在handleBaseException()方法中。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要将从数据库查询出的数据以JSON格式展示在index.html,可以通过以下步骤实现: 1. 创建Spring Boot项目,并添加依赖:spring-boot-starter-web、spring-boot-starter-data-jpa、mysql-connector-java等。 2. 在application.properties或application.yml配置数据库相关信息,如下所示: ``` spring.datasource.url=jdbc:mysql://localhost:3306/mydatabase spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.jdbc.Driver spring.jpa.show-sql=true spring.jpa.hibernate.ddl-auto=update spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5InnoDBDialect ``` 3. 创建实体类,并使用JPA注解将实体类映射到数据库表,如下所示: ``` @Entity @Table(name = "user") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String name; private Integer age; private String gender; // getter和setter方法 } ``` 4. 创建一个Repository接口,并继承JpaRepository接口,实现对User实体类的基本操作,如下所示: ``` @Repository public interface UserRepository extends JpaRepository<User, Long> { List<User> findByName(String name); List<User> findByGender(String gender); } ``` 5. 创建一个Controller类,使用@RestController注解,实现对User实体类的查询操作,并返回JSON格式的数据,如下所示: ``` @RestController public class UserController { @Autowired private UserRepository userRepository; @GetMapping("/users") public List<User> getUsers() { return userRepository.findAll(); } @GetMapping("/users/{id}") public User getUserById(@PathVariable Long id) { return userRepository.findById(id).orElse(null); } @GetMapping("/users/name/{name}") public List<User> getUserByName(@PathVariable String name) { return userRepository.findByName(name); } @GetMapping("/users/gender/{gender}") public List<User> getUserByGender(@PathVariable String gender) { return userRepository.findByGender(gender); } } ``` 6. 在index.html使用jQuery的ajax方法,通过HTTP GET请求获取UserController返回的JSON数据,并将数据展示在页面上,如下所示: ``` <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>User List</title> <script src="https://code.jquery.com/jquery-3.5.1.min.js"></script> <script> $(document).ready(function() { $.getJSON("/users", function(data) { $.each(data, function(index, user) { var row = $("<tr><td>" + user.id + "</td><td>" + user.name + "</td><td>" + user.age + "</td><td>" + user.gender + "</td></tr>"); $("#userTable").append(row); }); }); }); </script> </head> <body> <h1>User List</h1> <table id="userTable"> <tr> <th>ID</th> <th>Name</th> <th>Age</th> <th>Gender</th> </tr> </table> </body> </html> ``` 以上就是从数据库查询出数据以JSON格式展示在index.html的步骤。通过这种方式,可以方便地将数据库的数据展示在Web页面上。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值