Java 弹簧靴压缩不起作用
我有一个基于spring引导的应用程序。我想通过RESTAPI从数据库下载大量数据,作为文本文件。 由于数据量可能非常巨大,比如说至少有1_000_000 enries,我决定使用Java8提供的流。幸运的是,SpringDataJPA允许流式查询 它工作正常,但我想压缩下载的结果。我知道Tomcat提供了这样的功能 但是由于某些原因,结果文件没有被压缩。不知道我做错了什么 请看一下到目前为止我编写的代码: 模型 道层 最后是Rest控制器 在application.properties文件中,我添加了server.compression.enabled=true,因为我已经设置了标题内容类型text/plain,我想默认情况下应该对其进行压缩 任何想法都将不胜感激。Java 弹簧靴压缩不起作用,java,http,tomcat,spring-boot,spring-data-jpa,Java,Http,Tomcat,Spring Boot,Spring Data Jpa,我有一个基于spring引导的应用程序。我想通过RESTAPI从数据库下载大量数据,作为文本文件。 由于数据量可能非常巨大,比如说至少有1_000_000 enries,我决定使用Java8提供的流。幸运的是,SpringDataJPA允许流式查询 它工作正常,但我想压缩下载的结果。我知道Tomcat提供了这样的功能 但是由于某些原因,结果文件没有被压缩。不知道我做错了什么 请看一下到目前为止我编写的代码: 模型 道层 最后是Rest控制器 在application.properties文件中,
提前感谢。如果使用setContentType设置内容类型会发生什么?另外,如何确定响应未被压缩?如果您希望得到一个gzip文件,那么您不会。字节将在网络上被压缩,浏览器将对其进行解压缩,并保存原始文本文件。@JB Nizet,谢谢您的回答。有没有办法防止这种行为不允许解压缩最终结果。换句话说,我只是希望它下载后被压缩。关于设置内容类型,我不太明白你的意思?我应该设置它吗?因为我认为在rest控制器中设置内容类型已经足够了。对于第一部分,您不想发送文本文件。您想发送一个gzip文件。将内容类型设置为application/x-gzip,将响应输出流包装成GZIPOutpurStream,然后将文本写入此gzipoutputsream。听起来不错,谢谢您的帮助!
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private Integer age;
public User() {
}
public User(String name, Integer age) {
this.name = name;
this.age = age;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"id=" + id +
", name='" + name + '\'' +
", age=" + age +
'}';
}
}
public interface UserRepository extends JpaRepository<User, Long> {
@Query("SELECT u from User u")
@QueryHints(value = @QueryHint(name = HINT_FETCH_SIZE, value = "" + Integer.MIN_VALUE))
Stream<User> streamAll();
}
@RestController
public class DownloadController {
@Autowired
private UserRepository userRepository;
@PersistenceContext
EntityManager entityManager;
@RequestMapping(value = "/stream", method = RequestMethod.GET)
@Transactional(readOnly = true)
public void stream(HttpServletResponse response) {
response.addHeader("Content-Type", "text/plain");
response.addHeader("Content-Disposition", "attachment");
response.setCharacterEncoding("UTF-8");
try(Stream<User> users = userRepository.streamAll()) {
PrintWriter out = response.getWriter();
users.forEach(u -> {
out.write(u.toString());
out.write("\n");
entityManager.detach(u);
});
out.flush();
} catch (Exception e) {
throw new RuntimeException("Exception occurred while exporting results", e);
}
}
}