【问题标题】:How to read a JSON file stored in classpath resource in Spring Webflux?如何在 Spring Webflux 中读取存储在类路径资源中的 JSON 文件?
【发布时间】:2019-12-14 23:46:48
【问题描述】:

我是 Spring WebFlux 的新手。我想读取存储在classpath resource 中的 JSON 文件并转换为 POJO 类。文件夹结构为resources/defaults/myjson.json。我正在使用杰克逊进行转换。阅读后,这将转换为MyJson.java。截至目前,我正在执行以下方法。

@Service
public class MyService {

    private final ObjectMapper objectMapper;
    private MyJson myJson;

    @Autowired
    public MyService(ObjectMapper objectMapper) {
        this.objectMapper = objectMapper;
        this.myJson = MyFileUtils.readFile(objectMapper, "classpath:/defaults/myjson.json", MyJson.class);
    }

    public MyJson getMyJson() {
        return this.myJson;
    }
}

还有其他方法吗?

【问题讨论】:

    标签: spring-boot spring-webflux


    【解决方案1】:

    你可以使用ObjectMapper

    Pojo pojo = new ObjectMapper().readValue(new ClassPathResource("./defaults/myjson.json").getFile(), Pojo.class);
    

    在这里 Pojo 定义你的 pojo 类。

    【讨论】:

    • 好的。现在我有一个疑问。这是阻塞 IO,不是吗?
    • 是的,这是阻塞 IO。
    • 您可以通过创建一个单独的线程并将此任务发送给该线程来修改此代码以支持非阻塞 io。
    【解决方案2】:

    感谢您提出这个问题,并感谢 gnana jeyam95 的回答帮助了我。

    我想回答你关于这将是一个阻塞 IO 的事实(我自己不知道这是不是真的)。​​

    也许,如果这是一个问题,您可以在应用程序启动期间一次性加载 POJO,然后始终克隆加载的 POJO(例如使用 SerializationUtils),这样您就不需要再读取 JSON 文件了应用程序的启动已完成。

    我在我的项目中做了这样的事情:

    import com.fasterxml.jackson.databind.ObjectMapper;
    import org.apache.commons.lang3.SerializationUtils;
    import org.springframework.stereotype.Service;
    import javax.annotation.PostConstruct;
    
    @Service
    public class FooServiceImpl implements FooService {
        private Pojo pojo;
    
        @PostConstruct
        void init() {
            try {
                pojo = new ObjectMapper().readValue(new ClassPathResource("pojo.json").getFile(), Pojo.class);
            } catch (IOException e) {
                // Log error
            }
        }
    
        public void myMethodNeedingPojoFromJson() {
            // Do stuff
            Pojo methodPojo = SerializationUtils.clone(pojo);
            // Do other stuff
        }
    }
    

    但是,我不知道这种优化是否是个好主意。 此外,可能有一种更优雅的方式来做到这一点......任何评论将不胜感激。 ^_^

    【讨论】:

    • 不需要克隆。正如 gnana jeyam95 和我已经做过的方式(这是有问题的)所说,绰绰有余。这将使应用程序非阻塞。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-11
    • 2020-03-01
    • 2016-03-05
    • 1970-01-01
    • 2019-10-17
    • 2010-12-08
    • 2011-12-15
    相关资源
    最近更新 更多