Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring引导流大型JSON数据集_Java_Angularjs_Spring Boot_Jackson_Java Stream - Fatal编程技术网

Java Spring引导流大型JSON数据集

Java Spring引导流大型JSON数据集,java,angularjs,spring-boot,jackson,java-stream,Java,Angularjs,Spring Boot,Jackson,Java Stream,我有一个包含1400000行的表,一个控制器返回所有这些记录JSON格式,AngularJS前端遍历这些记录,然后输出一个pdf文件 正如预期的那样,调用此控制器会导致cpu使用率高,导致GUI速度慢甚至无法访问。在寻找可能的解决方法时,我遇到了以下关于使用Stream。但是,我无法使其工作,我所做的是: 在Repository界面中声明以下方法: @Query(value = "SELECT * FROM subscriber", nativeQuery = true) p

我有一个包含1400000行的表,一个控制器返回所有这些记录JSON格式,AngularJS前端遍历这些记录,然后输出一个pdf文件

正如预期的那样,调用此控制器会导致cpu使用率高,导致GUI速度慢甚至无法访问。在寻找可能的解决方法时,我遇到了以下关于使用
Stream
。但是,我无法使其工作,我所做的是:

Repository
界面中声明以下方法:

@Query(value = "SELECT * FROM subscriber", nativeQuery = true)
public Stream<Subscriber> findAllByCustomQueryAndStream();
还有一个
映射Jackson2httpMessageConverter
,如下所示:

@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
    MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
    ObjectMapper objectMapper = jsonConverter.getObjectMapper();
    SimpleModule module = new SimpleModule("Stream");
    module.addSerializer(Stream.class, new JsonSerializer<Stream>() {

    @Override
    public void serialize(Stream value, JsonGenerator gen, SerializerProvider serializers)
        throws IOException, JsonProcessingException {
        serializers.findValueSerializer(Iterator.class, null).serialize(value.iterator(), gen, serializers);

        }
    });

    objectMapper.registerModule(module);
    jsonConverter.setObjectMapper(objectMapper);
    return jsonConverter;
}
@Bean
公共映射Jackson2HttpMessageConverter映射Jackson2HttpMessageConverter(){
MappingJackson2HttpMessageConverter jsonConverter=新的MappingJackson2HttpMessageConverter();
ObjectMapper ObjectMapper=jsonConverter.getObjectMapper();
SimpleModule=新的SimpleModule(“流”);
addSerializer(Stream.class,新的JsonSerializer()){
@凌驾
公共void序列化(流值、JsonGenerator gen、SerializerProvider序列化器)
抛出IOException、JsonProcessingException{
serializers.findValueSerializer(Iterator.class,null).serialize(value.Iterator(),gen,serializers);
}
});
objectMapper.registerModule(模块);
setObjectMapper(objectMapper);
返回jsonConverter;
}
但是,当我调用
/subscriber/all
时,我得到以下异常:

org.springframework.dao.InvalidDataAccessApiUsageException:您正在尝试执行一个流查询方法,而没有一个使连接保持打开的周围事务,以便流可以实际使用。确保使用流的代码使用@Transactional或任何其他方式声明(只读)事务

如果我用
@Transactional(readOnly=true)
注释
Stream getAll()
方法,我会得到以下异常:

2017-08-29 23:12:08022[]警告-org.hibernate.engine.jdbc.spi.SqlExceptionHelper-SQL错误:0,SQLState:S1000

2017-08-29 23:12:08023[][http-nio-8089-exec-10]错误-org.hibernate.engine.jdbc.spi.SqlExceptionHelper-结果集关闭后不允许操作

2017-08-29 23:12:08029[][http-nio-8089-exec-10]警告-org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver-无法写入http消息:org.springframework.http.converter.HttpMessageNotWritableException:无法写入内容:无法使用next()前进;嵌套异常为com.fasterxml.jackson.databind.JsonMappingException:无法使用next()前进


我尝试过搜索,但仍然没有任何运气,非常感谢您在这方面提供的任何帮助。

AngularJS前端,它迭代这些记录,然后输出一个pdf文件
为什么AngularJS要创建pdf,这不能在服务器端完成并返回到客户端进行下载吗?您不明白异常中极其详细和清晰的消息的哪一部分?Spring控制器不能返回和流式处理(尚未支持。它将在Spring 5中提供)。您最好的选择是在后端创建pdf,并直接在OutputStream中进行传输。即使您成功地流式传输了这些记录,浏览器也将无法从大量数据生成pdf。在服务器上生成pdf。我也遇到了同样的问题,我想知道在转换过程中,当jackson尝试访问
Subscriber
字段时,是否会触发延迟加载。您还尝试过使用
@QueryHints(value=@QueryHint(name=HINT\u FETCH\u SIZE,value=”“+Integer.MIN\u value))
?我认为在这种情况下,它需要依赖于数据库的特定提示(请参阅)
@Bean
public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() {
    MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
    ObjectMapper objectMapper = jsonConverter.getObjectMapper();
    SimpleModule module = new SimpleModule("Stream");
    module.addSerializer(Stream.class, new JsonSerializer<Stream>() {

    @Override
    public void serialize(Stream value, JsonGenerator gen, SerializerProvider serializers)
        throws IOException, JsonProcessingException {
        serializers.findValueSerializer(Iterator.class, null).serialize(value.iterator(), gen, serializers);

        }
    });

    objectMapper.registerModule(module);
    jsonConverter.setObjectMapper(objectMapper);
    return jsonConverter;
}