Spring MVC 响应机制综合实践:页面、数据、JSON 与响应配置

Spring MVC 响应机制的核心方式

返回视图(页面渲染)

通过返回视图名称(如 return "home"),配合视图解析器(InternalResourceViewResolver)定位到 /WEB-INF/views/home.jsp 等具体页面。需在配置中定义视图前缀和后缀:

java 复制代码
@Bean
public ViewResolver viewResolver() {
    InternalResourceViewResolver resolver = new InternalResourceViewResolver();
    resolver.setPrefix("/WEB-INF/views/");
    resolver.setSuffix(".jsp");
    return resolver;
}

返回纯文本或HTML

使用 @ResponseBody 注解直接返回字符串内容,适用于简单文本或HTML片段:

java 复制代码
@GetMapping("/text")
@ResponseBody
public String rawText() {
    return "<h1>Hello World</h1>";
}

JSON 响应处理

自动序列化对象为JSON

结合 @RestController 或 @ResponseBody,Spring 默认使用 Jackson 将对象序列化为 JSON:

java 复制代码
@GetMapping("/user")
public User getUser() {
    return new User("Alice", 25);
}

需添加 Jackson 依赖(如 spring-boot-starter-json)。

定制JSON字段

通过 @JsonIgnore 忽略字段,@JsonProperty 重命名字段:

java 复制代码
public class User {
    @JsonProperty("username")
    private String name;
    
    @JsonIgnore
    private String password;
}

响应头与状态码控制

手动设置状态码

使用 ResponseEntity 自定义状态码和响应头:

java 复制代码
@GetMapping("/custom")
public ResponseEntity<String> customResponse() {
    HttpHeaders headers = new HttpHeaders();
    headers.add("X-Custom-Header", "value");
    return new ResponseEntity<>("Custom Body", headers, HttpStatus.CREATED);
}

重定向与转发

通过 redirect: 前缀实现重定向,或返回 ModelAndView 进行转发:

java 复制代码
@GetMapping("/redirect")
public String redirect() {
    return "redirect:/new-url";
}

全局响应配置

统一响应格式

使用 @ControllerAdvice 定义全局响应封装:

java 复制代码
@ControllerAdvice
public class GlobalResponseHandler implements ResponseBodyAdvice<Object> {
    @Override
    public boolean supports(MethodParameter returnType, Class<? extends HttpMessageConverter<?>> converterType) {
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, 
                                  Class<? extends HttpMessageConverter<?>> selectedConverterType, 
                                  ServerHttpRequest request, ServerHttpResponse response) {
        return new ResponseWrapper<>(200, "success", body);
    }
}

CORS 跨域配置

在配置类中全局启用 CORS:

java 复制代码
@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/api/**")
                .allowedOrigins("*")
                .allowedMethods("GET", "POST");
    }
}

异常处理与错误响应

统一异常处理

通过 @ExceptionHandler 捕获异常并返回结构化错误信息:

java 复制代码
@ControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    public ResponseEntity<ErrorResponse> handleException(Exception ex) {
        ErrorResponse error = new ErrorResponse(500, ex.getMessage());
        return ResponseEntity.status(500).body(error);
    }
}

自定义错误页面

配置 ErrorViewResolver 或定义 /error 映射:

java 复制代码
@Controller
public class ErrorController implements ErrorController {
    @RequestMapping("/error")
    public String handleError(HttpServletRequest request) {
        Integer status = (Integer) request.getAttribute("javax.servlet.error.status_code");
        return status == 404 ? "error-404" : "error-general";
    }
}
相关推荐
唠点键盘之外的2 小时前
26 向量数据库实战:从 0 搭一条能用的检索链路(pgvector + Spring AI)
数据库·人工智能·spring
考虑考虑4 小时前
@JsonInclude注解使用
spring boot·后端·spring
ly76896 小时前
Spring Data MongoDB 批量写入实践:BulkOperations 批大小与写关注权衡
java·mongodb·spring·批量写入·bulkoperations·写关注·mongotemplate
会编程的吕洞宾6 小时前
Spring AI 2.0 自校正结构化输出实战:让大模型稳定吐出合格 JSON
java·人工智能·后端·spring
java资料站7 小时前
七、Spring AI Alibaba · Skills
java·后端·spring
霸道流氓气质9 小时前
LLM API密钥管理与轮换策略:Spring Vault动态密钥、熔断限流协同与多Provider路由的 Java 生产级实现
java·后端·spring
木头科技11 小时前
【AI 工程化第十五篇】Spring AI 流式输出高并发性能优化实战:SSE、背压、限流、缓存与灰度发布
人工智能·spring·性能优化
阿狗童鞋12 小时前
SpringSecurity权限认证实战指南
java·后端·spring
会编程的吕洞宾13 小时前
Spring Cloud Gateway限流实战 Redis令牌桶算法+熔断降级
java·后端·spring
sp42a14 小时前
简单的 Spring 文件上传与下载组件
java·后端·spring