Spring MVC用ResponseEntity返回可实现更强大的功能

今天有粉丝询问胖哥开源微信支付V3开发包Payment Spring Boot下载对账单接口的一些细节,并问我为什么要返回ResponseEntity对象而不是直接返回一个业务实体对象。今天就来统一解答一下并科普一下它的用途。

ResponseEntity

ResponseEntity对象是Spring对请求响应的封装。它继承了HttpEntity对象,包含了Http的响应码(httpstatus)、响应头(header)、响应体(body)三个部分。一个获取用户信息的Spring MVC接口通常我们直接返回实体即可(配合@RestController):

@GetMapping("/user")
public User userinfo() {
    User user = new User();
    user.setUsername("felord.cn");
    return user;
}

等同于使用ResponseEntity作为控制器接口的返回值:

    @GetMapping("/userinfo")
    public ResponseEntity<User> user() {
        User user = new User();
        user.setUsername("felord.cn");
        return ResponseEntity.ok(user);
    }

但是使用ResponseEntity时我们可以做更多事情。

自定义响应码

上面的ResponseEntity.ok已经包含了返回200Http响应码,我们还可以通过ResponseEntity.status(HttpStatus|int)来自定义返回的响应码。

自定义响应体

放置响应的响应体,通常就是我们接口的数据,这里是一个例子:

ResponseEntity.status(HttpStatus.OK)
               .body(Object)

响应头

通常我们指定Spring MVC接口的响应头是通过@RequestMapping和其Restful系列注解中的header()consumesproduces()这几个属性设置。如果你使用了ResponseEntity,可以通过链式调用来设置:

ResponseEntity.status(HttpStatus.OK)
               .allow(HttpMethod.GET)
               .contentType(MediaType.APPLICATION_JSON)
               .contentLength(1048576)
               .header("My-Header","felord.cn")
               .build();

所有的标准请求头都有对应的设置方法,你也可以通过header(String headerName, String... headerValues)设置自定义请求头。

大致原理

我们来看一个用来处理Spring MVC控制器接口返回值的抽象接口HandlerMethodReturnValueHandler

public interface HandlerMethodReturnValueHandler {

 /**
  * 支持的返回值类型
  */
 boolean supportsReturnType(MethodParameter returnType);

 /**
  *  将数据绑定到视图,并设置处理标志以指示已直接处理响应,后续的其它方法就不处理了,优先级非常高
  */
 void handleReturnValue(@Nullable Object returnValue, MethodParameter returnType,
   ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception;

}

它的一个重要实现HttpEntityMethodProcessor就是处理返回类型为HttpEntity的控制器方法的处理器。它会把ResponseEntity携带的三种信息交给ServletServerHttpResponse对象渲染视图,并设置处理标志以指示已直接处理响应,后续的其它方法就不处理了,优先级非常高。

实战运用

通常让你写个下载文件接口都是拿到HttpServletResponse对象,然后配置好Content-Type往里面写流。如果用ResponseEntity会更加简单优雅。

@GetMapping("/download")
public ResponseEntity<Resource> load() {
    ClassPathResource classPathResource = new ClassPathResource("application.yml");
    String filename = classPathResource.getFilename();
    HttpHeaders httpHeaders = new HttpHeaders();
    httpHeaders.setContentDisposition(ContentDisposition.inline().filename(filename, StandardCharsets.UTF_8).build());
    return ResponseEntity.ok()
            .headers(httpHeaders)
            .body(classPathResource);
}

上面是一个把Spring Boot配置文件 application.yml下载下来的例子。主要分为三步:

  • 将要下载的文件封装成org.springframework.core.io.Resource对象,它有很多实现。这里用了ClassPathResource,其它InputStreamResourcePathResource都是常用的实现。

  • 然后配置下载文件请求头Content-Disposition。针对下载它有两种模式: inline表示在浏览器直接展示文件内容;attachment表示下载为文件。另外下载后的文件名也在这里指定,请不要忘记文件扩展名,例如这里application.yml。如果不指定Content-Disposition,你需要根据文件扩展名设置对应的Content-Type,会麻烦一些。

  • 最后是组装ResponseEntity<Resource>返回。

原理参见org.springframework.http.converter.ResourceHttpMessageConverter

inline模式下载文件对应的效果:

图片

下载文件时展示文件

总结

今天对Spring 中的ResponseEntity作用和机制进行了分享,同时贴近实战分享了下载文件的另一种办法。在胖哥的微信支付开发包Payment Spring BootResponseEntity得到了大量的运用,有兴趣可以去看一下源码实现。好了今天的分享就到这里,多多关注:码农小胖哥  学习更多有用的开发实战技巧。原创不易!也请多多点赞、转发、再看

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用Apache POI来实现Excel的导入和读取,同时使用Spring MVC框架将错误信息以链接形式返回,可供下载。以下是一个基本的实现步骤: 1. 导入Apache POI依赖 在pom.xml文件中,添加以下依赖: ``` <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.2</version> </dependency> ``` 2. 编写Excel导入代码 使用POI读取Excel文件,并将数据存储到Java对象中,例如: ``` Workbook workbook = null; try { workbook = WorkbookFactory.create(file); // file是上传的Excel文件 Sheet sheet = workbook.getSheetAt(0); // 获取第一个工作表 for (Row row : sheet) { String name = row.getCell(0).getStringCellValue(); int age = (int) row.getCell(1).getNumericCellValue(); // 将数据存储到Java对象中 User user = new User(name, age); userList.add(user); } } catch (Exception e) { e.printStackTrace(); } finally { if (workbook != null) { try { workbook.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` 3. 验证数据,将错误信息存储到Map中 对于不符合要求的数据,例如年龄为负数的情况,可以将错误信息存储到Map中,例如: ``` Map<Integer, String> errorMap = new HashMap<>(); // 用于存储错误信息 for (int i = 0; i < userList.size(); i++) { User user = userList.get(i); if (user.getAge() < 0) { errorMap.put(i, "年龄不能为负数"); } } ``` 4. 将错误信息以链接形式返回Spring MVC的Controller中,可以将错误信息以链接形式返回,例如: ``` @RequestMapping(value = "/downloadErrorFile", method = RequestMethod.GET) public ResponseEntity<byte[]> downloadErrorFile() throws IOException { ByteArrayOutputStream out = new ByteArrayOutputStream(); try (Workbook workbook = new XSSFWorkbook()) { Sheet sheet = workbook.createSheet(); int rowIndex = 0; for (Map.Entry<Integer, String> entry : errorMap.entrySet()) { Row row = sheet.createRow(rowIndex++); row.createCell(0).setCellValue(entry.getKey()); row.createCell(1).setCellValue(entry.getValue()); } workbook.write(out); } byte[] bytes = out.toByteArray(); HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_OCTET_STREAM); headers.setContentDispositionFormData("attachment", "error.xlsx"); return new ResponseEntity<>(bytes, headers, HttpStatus.CREATED); } ``` 通过访问/downloadErrorFile接口,即可下载包含错误信息的Excel文件。 ### 回答2: 要实现Java中的Excel导入功能,并将错误的以链接形式返回,可供下载,可以按照以下步骤进行操作: 1. 使用Java的Apache POI库来操作Excel文件。Apache POI提供了一组API,可以读取、写入和操作Excel文件。 2. 首先,使用POI库中的Workbook类来打开Excel文件。可以使用FileInputStream类来读取Excel文件,并创建一个Workbook对象来表示整个Excel文件。 3. 接下来,使用Workbook对象来获取要导入的Excel文件中的具体数据。使用Sheet类和Row类来遍历各个工作表和行。 4. 对于每一行,可以使用Cell类来获取具体的单元格数据。根据Excel文件的格式,使用getCell方法并提供列索引来获取特定单元格的数据。 5. 在处理数据时,可以进行一系列的验证操作,如数据格式、数据范围等验证。如果出现错误,记录下错误信息并保存。 6. 将错误信息保存到一个集合或数据库中,同时生成一个链接,指向保存错误信息的文件或数据库。 7. 最后,使用其他的框架或技术,如Spring MVC或Servlet,创建一个接口让用户可以下载错误信息。可以使用文件下载的HTTP响应头来提供下载链接。 通过以上步骤,我们可以实现Java中Excel的导入功能,并将错误信息以链接形式返回,供用户下载。用户可以点击下载链接,获取包含错误信息的文件,以便进行后续处理或分析。 ### 回答3: 在Java中实现Excel导入功能可以通过Apache POI库来实现。以下是一种实现方式: 首先,需要导入Apache POI的相关依赖,包括poi、poi-ooxml、poi-ooxml-schemas和commons-collections4等。 接下来,通过POI提供的API,可以读取Excel文件的内容。可以使用`WorkbookFactory`来打开Excel文件,然后通过获取`Sheet`对象来遍历处理每个工作表中的数据。 在读取Excel文件时,可以将错误的数据记录下来。例如,可以定义一个`List<String>`来存储错误信息,出现错误时通过`add`方法将错误信息加入到列表中。 完成Excel文件的读取和错误记录后,可以将错误信息以链接形式返回给用户。可以使用一个Web框架(如Spring MVC)来实现用户界面,然后使用Java的文件操作功能将错误信息保存为一个txt或csv文件。可以使用`PrintWriter`来将错误信息写入文件中。 最后,将保存错误信息的文件连接返回给用户并提供下载链接。在Web界面中,可以通过生成一个下载链接,使用户可以点击链接下载错误信息文件。可以使用`<a>`标签来生成下载链接,将指向错误信息文件的URL作为链接的`href`属性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值