Java 弹簧靴压缩不起作用

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文件中,

我有一个基于spring引导的应用程序。我想通过RESTAPI从数据库下载大量数据,作为文本文件。 由于数据量可能非常巨大,比如说至少有1_000_000 enries,我决定使用Java8提供的流。幸运的是,SpringDataJPA允许流式查询

它工作正常,但我想压缩下载的结果。我知道Tomcat提供了这样的功能

但是由于某些原因,结果文件没有被压缩。不知道我做错了什么

请看一下到目前为止我编写的代码:

模型

道层

最后是Rest控制器

在application.properties文件中,我添加了server.compression.enabled=true,因为我已经设置了标题内容类型text/plain,我想默认情况下应该对其进行压缩

任何想法都将不胜感激。
提前感谢。

如果使用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);
        }
    }

}