gpt4 book ai didi

java - 如何在 web-inf/class 下的类命名空间中创建/写入文件

转载 作者:塔克拉玛干 更新时间:2023-11-01 19:11:55 25 4
gpt4 key购买 nike

我编写了以下内容以将对象缓存到类资源位置。

static private <T> void toSerializedCache(Class<T> cls, T t, String cachecrlstr) {
try {
URL crl = cls.getResource(cachecrlstr);
File crf = new File(crl.getFile());

JAXBContext jaxbContext = JAXBContext.newInstance(cls);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
jaxbMarshaller.marshal(t, crf);
}
catch (Exception e) {
System.out.printf("Failed to write %s to cache %s", t.getClass(), cachecrlstr);
}
}

问题是 cachecrlstr 是一个最初不存在的文件。该文件必须是最初创建的。

由于它最初是不存在的,类加载器会将 url 返回为 null 并且过程失败。

我不能使用绝对路径,因为这个例程在 Web 服务上运行,我们需要从类加载器推断出绝对路径。

为了解决这个问题,我把例程重写为

static private <T> void toSerializedCache(Class<T> cls, T t, String cachecrlstr) {
try {
File crf = new File(request.getSession().getServletContext().getRealPath("/WEB-INF/class"+cachecrlstr));

JAXBContext jaxbContext = JAXBContext.newInstance(cls);
Marshaller jaxbMarshaller = jaxbContext.createMarshaller();
jaxbMarshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
jaxbMarshaller.marshal(t, file);
}
catch (JAXBException e) {
System.out.printf("Failed to write %s to cache %s", t.getClass(), cachecrlstr);
}
}

但是我无法获得 httpservletrequest 对象,因为这个例程在 jax-rs 服务实现中。而我不愿意写一个http监听器(那些在web.xml中注册的)来将请求存储到Threadlocal映射中。 (意思是,不想为维护 Threadlocal 对象而烦恼)。

但是,(虽然不愿意写)我愿意从 Threadlocal 中撤回对象。

有谁知道 RestEasy 是否在 Threadlocal 中存储了任何 http 对象,我可以提取这些对象来推断 session 上下文或请求?

更重要的问题是 - 你建议我如何将对象写入文件,其中文件路径是相对于 WEB-INF/class 的,在我上面陈述的约束下。

最佳答案

您可以从 ResteasyProviderFactory 获取 HttpServletRequest:

HttpServletRequest request = (HttpServletRequest) ResteasyProviderFactory.getContextDataMap().get(HttpServletRequest.class);

或者,如果您在 JAX-RS 服务或拦截器中,RESTEasy 可以为您注入(inject) HttpServletRequest

@javax.ws.rs.core.Context
HttpServletRequest request;

关于java - 如何在 web-inf/class 下的类命名空间中创建/写入文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11473996/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com