我正在尝试扩展库以进行集成,Swing
并JPA
通过将JPA
config设置为自动(可移植)来实现,这意味着以编程方式添加<class>
元素。(我知道可以通过Hibernate
AnnotationConfiguration
或EclipseLInk来实现ServerSession
,但是-
可移植性)。我也想避免Spring
仅用于此单一目的。
我可以动态创建一个persistence.xml
,并用<class>
指定包中的元素填充它(通过Reflections库)。当我尝试persistence.xml
将其JPA
提供给提供程序时,问题就开始了。我能想到的唯一方法是设置一个URLClassLoader
,但我想不出什么方法使我无法将文件首先写入磁盘,这是唯一获得有效的能力URL
。设置用于通过URL
(localhost:xxxx
)提供文件服务的套接字似乎…我不知道,这是邪恶的吗?
有谁知道我该如何解决这个问题?我知道避免使用一个库听起来很麻烦,但我只想知道是否可以完成。
编辑 (尝试更清晰):
动态生成的XML
内容保存在一个String
对象中。我不知道如何将其提供给 持久性提供程序 。另外,我想避免将文件写入磁盘。
就我的问题而言, 持久性提供程序 只是一个在类路径中扫描的类META- INF/persistence.xml
。可以使某些实现接受动态创建XML
,但没有通用接口(尤其是文件的关键部分,即<class>
标记)。
我的想法是建立一个自定义ClassLoader
-如果您有其他需要的我将不胜感激,那么我就不会对此设置。
我能找到的唯一容易扩展/配置的是URLClassLoader
。它可以在URL
对象上运行,而且我不知道是否可以在不首先将XML实际写入磁盘的情况下创建对象。
这就是我进行设置的方式,但是通过将其写入persistenceXmlFile = new File("META- INF/persistence.xml")
磁盘来工作:
Thread.currentThread().setContextClassLoader(
new URLResourceClassLoader(
new URL[] { persistenceXmlFile.toURI().toURL() },
Thread.currentThread().getContextClassLoader()
)
);
URLResourceClassLoader
是URLCLassLoader
的子类,它可以通过重写来查找资源和类public Enumeration<URL> findResources(String name)
。
也许有点晚了(4年后),但是对于其他正在寻找类似解决方案的人,您可以使用我创建的URL工厂:
public class InMemoryURLFactory {
public static void main(String... args) throws Exception {
URL url = InMemoryURLFactory.getInstance().build("/this/is/a/test.txt", "This is a test!");
byte[] data = IOUtils.toByteArray(url.openConnection().getInputStream());
// Prints out: This is a test!
System.out.println(new String(data));
}
private final Map<URL, byte[]> contents = new WeakHashMap<>();
private final URLStreamHandler handler = new InMemoryStreamHandler();
private static InMemoryURLFactory instance = null;
public static synchronized InMemoryURLFactory getInstance() {
if(instance == null)
instance = new InMemoryURLFactory();
return instance;
}
private InMemoryURLFactory() {
}
public URL build(String path, String data) {
try {
return build(path, data.getBytes("UTF-8"));
} catch (UnsupportedEncodingException ex) {
throw new RuntimeException(ex);
}
}
public URL build(String path, byte[] data) {
try {
URL url = new URL("memory", "", -1, path, handler);
contents.put(url, data);
return url;
} catch (MalformedURLException ex) {
throw new RuntimeException(ex);
}
}
private class InMemoryStreamHandler extends URLStreamHandler {
@Override
protected URLConnection openConnection(URL u) throws IOException {
if(!u.getProtocol().equals("memory")) {
throw new IOException("Cannot handle protocol: " + u.getProtocol());
}
return new URLConnection(u) {
private byte[] data = null;
@Override
public void connect() throws IOException {
initDataIfNeeded();
checkDataAvailability();
// Protected field from superclass
connected = true;
}
@Override
public long getContentLengthLong() {
initDataIfNeeded();
if(data == null)
return 0;
return data.length;
}
@Override
public InputStream getInputStream() throws IOException {
initDataIfNeeded();
checkDataAvailability();
return new ByteArrayInputStream(data);
}
private void initDataIfNeeded() {
if(data == null)
data = contents.get(u);
}
private void checkDataAvailability() throws IOException {
if(data == null)
throw new IOException("In-memory data cannot be found for: " + u.getPath());
}
};
}
}
}
问题内容: 有什么方法可以从中创建对象吗? 我的要求是从RAR读取文件。我不是要写一个临时文件,而是要在RAR存档中找到一个文件。 问题答案: 您需要创建新文件并将内容复制到该文件: 我使用方便来避免手动复制流。它还具有内置缓冲。
问题内容: 我想创建图像的base64内联编码数据,以便使用画布显示在表中。Python动态生成和创建网页。目前,python使用Image模块创建缩略图。创建所有缩略图后,Python然后生成每个缩略图的base64数据,并将b64数据放入用户网页的隐藏范围内。然后,用户单击每个缩略图相对于其兴趣的复选标记。然后,他们通过单击生成pdf按钮创建一个包含所选图像的pdf文件。使用jsPDF的Jav
问题内容: 如何在Python中使类或方法抽象? 我尝试像这样重新定义: 但是现在,如果我创建一个像这样继承的类: 那么我也无法实例化,因为它调用了其超类的方法。 有没有更好的方法来定义抽象类? 问题答案: 使用该模块创建抽象类。使用装饰器来声明方法摘要,并根据您的Python版本使用以下三种方式之一声明类摘要。 在Python 3.4及更高版本中,您可以从继承。在Python的早期版本中,您需要
问题内容: 是否可以创建内联伪样式? 例如,我可以做以下事情吗? 这背后的原因是我正在开发一个创建UI元素的.NET库。我想生成无需设置外部样式表即可设置其悬停状态的HTML元素。 问题答案: 不幸的是,不能,您不能使用内联CSS来实现悬停效果。 此问题的(较差)解决方法是让控件在呈现时呈现样式块。例如,您的控件可以呈现为: 如果您可以强迫用户在页面顶部放置“样式控件”,则可以在其中渲染所有自定义
问题内容: 例如; 我正在使用此类: 如果我想创建N个点(originTwo,originThree … originN); 我可以使用像这样的for循环吗? 如果它是可能的; 我如何给他们起不同的名字? 问题答案: 您可以将它们放入数组。 他们会全部使用相同的,并在这些条件下。 如果你有数组和你可以做这样的: 如果您不喜欢数组,则可以使用列表: 您将其称为
问题内容: 我有以下JNI方法,它可以本地创建Java对象的集合,然后将其返回给Java: 我需要释放用本机代码创建的对象,还是由GC自动完成?如果可以,我该如何将其返回Java? 问题答案: 您不需要释放在本机代码中创建的Java对象。实际上,您不能。当没有其他引用时,垃圾收集器可以释放对象。 有时在本机代码中释放对Java对象的 引用 很有用。当本机代码保存但不再需要对大型对象的引用或大量引用