Spring batch 如何使用spring批处理和JSONIMReaderBuilder从外部API获取JSON数据

Spring batch 如何使用spring批处理和JSONIMReaderBuilder从外部API获取JSON数据,spring-batch,Spring Batch,我遵循了有效且足够简单和平庸的方法,但仍然不知道如何应用相同的技术从外部API获取JSON数据。据我所知,我必须使用JsonItemReaderBuilder并定义reader方法来返回JsonItemReader的实例,如下所示: @Configuration @EnableBatchProcessing public class BatchConfiguration { @Autowired public JobBuilderFactory jobBuilderFactor

我遵循了有效且足够简单和平庸的方法,但仍然不知道如何应用相同的技术从外部API获取JSON数据。据我所知,我必须使用
JsonItemReaderBuilder
并定义
reader
方法来返回
JsonItemReader
的实例,如下所示:

@Configuration
@EnableBatchProcessing
public class BatchConfiguration {

    @Autowired
    public JobBuilderFactory jobBuilderFactory;

    @Autowired
    public StepBuilderFactory stepBuilderFactory;

    @Bean
    public JsonItemReader<Person> reader() {
        return new JsonItemReaderBuilder<Person>()
                .name("personItemReader")
                .build();
    }
@配置
@启用批处理
公共类批处理配置{
@自动连线
公共建筑商建筑商工厂;
@自动连线
公共StepBuilderFactory StepBuilderFactory;
@豆子
公共JSONIMReader阅读器(){
返回新的JSONIMReaderBuilder()
.名称(“personItemReader”)
.build();
}

我遇到的问题是如何替换
.resource(新的ClassPathResource(“sample data.csv”))
line在上面的示例中,它只读取一个CSV文件?我想我必须以
InputStream
实例或类似的smth传递JSON数据?我应该传递什么样的资源?谢谢。

JSONIMReader可以与任何
org.springframework.core.io.resource
实现一起工作。因此,在您的情况下可以使用
org.springframework.core.io.UrlResource
。下面是一个快速示例:

@Bean
public JsonItemReader<Person> reader() throws Exception {
    URL resource = new URL("http/url/to/file/persons.json");
    return new JsonItemReaderBuilder<Person>()
            .name("personItemReader")
            .resource(new UrlResource(resource))
            .jsonObjectReader(new JacksonJsonObjectReader<>(Person.class))
            .build();
}
@Bean
public JSONIMReader()引发异常{
URL资源=新URL(“http/URL/to/file/persons.json”);
返回新的JSONIMReaderBuilder()
.名称(“personItemReader”)
.资源(新资源(资源))
.jsonObjectReader(新的JacksonJsonObjectReader(Person.class))
.build();
}

非常感谢,@mahmoud beh hassine!据我所知,我可以通过
https://example.com/v2/some-end-point
to
URL
constructor,对吗?上面的阅读器会自动解析并映射到
Person
对象吗?我是否需要任何其他选项才能传递到
jsonimreaderbuilder
builder?它是如何实现的可以设置
Header
值(例如
Authorization
)?我应该按如下方式获得连接:
HttpURLConnection con=(HttpURLConnection)url.openConnection();
可以设置请求头:
con.setRequestProperty(“内容类型”,“应用程序/json”);
还是
con.setRequestProperty(“授权承载者”,“一些令牌值-在这里”)
?是的,读者将阅读
资源的内容,就像它是本地的一样。关于添加http头,您可以尝试在将url传递到
UrlResource
之前设置它们(顺便说一句,这很好!)。好的,变得更清楚了。还有一件事要提——我们是否应该在最后关闭连接:
con.disconnect();
?(例如在
JobCompletionNotificationListener
)中)。它也不起作用,我在创建名为“reader”的bean时出错,该bean在类路径资源[hello/BatchConfiguration.class]中定义
原因:java.lang.IllegalArgumentException:需要一个json对象读取器。
我创建了一个API来给出一个想法。我在Heroku创建了一个API来获取一些数据(请参见
BatchConfiguration.java
类中的URL)。有关PhraseApp请求的部分已被注释掉。我可以从Heroku应用程序获取
posts
数据,但在到达PhraseApp端点时获得
401
code。原因来自
this.resource.exists()
签入
JsonItemReader
Spring类(请参阅我的最后一条注释)。