spring boot web应用为啥刷新页面没用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了spring boot web应用为啥刷新页面没用相关的知识,希望对你有一定的参考价值。

参考技术A 创建全局异常处理类:通过使用 @ControllerAdvice 定义统一的异常处理类,而不是在每个Controller中逐个定义。 @ExceptionHandler 用来定义函数针对的异常类型,最后将Exception对象和请求URL映射到 error.html
@ControllerAdvice
class GlobalExceptionHandler

public static final String DEFAULT_ERROR_VIEW = "error";

@ExceptionHandler(value = Exception.class)
public ModelAndView defaultErrorHandler(HttpServletRequest req, Exception e) throws Exception
ModelAndView mav = new ModelAndView();
mav.addObject("exception", e);
mav.addObject("url", req.getRequestURL());
mav.setViewName(DEFAULT_ERROR_VIEW);
return mav;




实现 error.html 页面展示:在 templates 目录下创建 error.html ,将请求的URL和Exception对象的message输出。
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8" />
<title>统一异常处理</title>
</head>
<body>
<h1>Error Handler</h1>
<div th:text="$url"></div>
<div th:text="$exception.message"></div>
</body>
</html>

启动该应用,访问: http://localhost:8080/hello ,可以看到如下错误提示页面。

通过实现上述内容之后,我们只需要在 Controller 中抛出 Exception ,当然我们可能会有多种不同的 Exception 。然后在 @ControllerAdvice 类中,根据抛出的具体 Exception 类型匹配 @ExceptionHandler 中配置的异常类型来匹配错误映射和处理。
返回JSON格式
在上述例子中,通过 @ControllerAdvice 统一定义不同Exception映射到不同错误处理页面。而当我们要实现RESTful API时,返回的错误是JSON格式的数据,而不是HTML页面,这时候我们也能轻松支持。
本质上,只需在 @ExceptionHandler 之后加入 @ResponseBody ,就能让处理函数return的内容转换为JSON格式。
下面以一个具体示例来实现返回JSON格式的异常处理。
创建统一的JSON返回对象,code:消息类型,message:消息内容,url:请求的url,data:请求返回的数据
public class ErrorInfo<T>

public static final Integer OK = 0;
public static final Integer ERROR = 100;

private Integer code;
private String message;
private String url;
private T data;

// 省略getter和setter



创建一个自定义异常,用来实验捕获该异常,并返回json
public class MyException extends Exception

public MyException(String message)
super(message);




Controller 中增加json映射,抛出 MyException 异常
@Controller
public class HelloController

@RequestMapping("/json")
public String json() throws MyException
throw new MyException("发生错误2");




为 MyException 异常创建对应的处理
@ControllerAdvice
public class GlobalExceptionHandler

@ExceptionHandler(value = MyException.class)
@ResponseBody
public ErrorInfo<String> jsonErrorHandler(HttpServletRequest req, MyException e) throws Exception
ErrorInfo<String> r = new ErrorInfo<>();
r.setMessage(e.getMessage());
r.setCode(ErrorInfo.ERROR);
r.setData("Some Data");
r.setUrl(req.getRequestURL().toString());
return r;




启动应用,访问: http://localhost:8080/json,可以得到如下返回内容:

code: 100,
data: "Some Data",
message: "发生错误2",
url: "http://localhost:8080/json"


至此,已完成在Spring Boot中创建统一的异常处理,实际实现还是依靠Spring MVC的注解,更多更深入的使用可参考Spring MVC的文档。本回答被提问者采纳

为啥 Spring Boot 应用程序 pom 同时需要 spring-boot-starter-parent 和 spring-boot-starter-web?

【中文标题】为啥 Spring Boot 应用程序 pom 同时需要 spring-boot-starter-parent 和 spring-boot-starter-web?【英文标题】:Why both spring-boot-starter-parent and spring-boot-starter-web are needed for Spring Boot application pom?为什么 Spring Boot 应用程序 pom 同时需要 spring-boot-starter-parent 和 spring-boot-starter-web? 【发布时间】:2020-05-23 01:10:46 【问题描述】:

我正在关注有关 Spring Boot 的视频教程(来自 javabrains.io)。示例项目的 pom 文件包含一个父块,其中groupIdorg.springframework.bootartifactIdspring-boot-starter-parent

此外,它还包含一个依赖块,其中groupIdorg.springframework.bootartifactIdspring-boot-starter-web

Q) 为什么我们的 pom.xml 中需要两个元素(即父元素和依赖元素)?

我想既然项目pom继承自spring-boot-starter-parent,那么所有的依赖也会自动继承。


示例项目pom.xml文件如下:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>io.javabrains.springbootquickstart</groupId>
    <artifactId>course-api</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>Java Brains Course API</name>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.4.2.RELEASE</version>
    </parent>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

    <properties>
        <java.version>1.8</java.version>
    </properties>
</project>

【问题讨论】:

【参考方案1】:

如果您查看spring-boot-starter-parent pom 文件,您会看到它提供了默认属性和 maven 插件配置,而spring-boot-starter-web 提供了与 web 相关的 spring 依赖项,无需任何额外配置。此外,两个 starter 都继承自 spring-boot-dependencies,它定义了 spring 支持的依赖项列表。这允许您在构建配置中省略任何这些依赖项的版本。您可以阅读the official documentation了解更多信息。

总而言之,spring-boot-starter-parent 提供

默认 maven 插件设置 默认的 Maven 属性 依赖管理

spring-boot-starter-web 引入与网络相关的依赖项。

【讨论】:

以上是关于spring boot web应用为啥刷新页面没用的主要内容,如果未能解决你的问题,请参考以下文章

为啥必须在 spring-boot 中为 web 应用程序提供单独的 @Controller 类文件?

为啥 Spring Boot 应用程序 pom 同时需要 spring-boot-starter-parent 和 spring-boot-starter-web?

spring-boot-web 应用程序上的静态内容可以是动态的(刷新)吗?

为啥这个 Spring Boot Web 应用不需要 @Repository?

使用Spring Boot开发者工具进行自动重启和页面自动刷新

使用Spring Boot开发者工具进行自动重启和页面自动刷新