Spring batch 如何使用spring批处理和JSONIMReaderBuilder从外部API获取JSON数据
我遵循了有效且足够简单和平庸的方法,但仍然不知道如何应用相同的技术从外部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
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
toURL
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类(请参阅我的最后一条注释)。