在没有 web.xml 的情况下在 Web 应用程序中使用 Cayenne Runtime
using CayenneRuntime in webapplication without web.xml
我有一个 Wicket 应用程序,我正在尝试实现可以远程更改的单独配置。无论如何,这是最终目标。
我想做的是通过手动启动 Cayenne 来设置它工作,而不是使用 web.xml 文件。我尝试了很多不同的东西,但我不确定我是否完全理解上下文是如何应用于所有线程的。
我已经尝试在我的应用程序中创建一个 ServerRuntime class。我还尝试了每个页面使用的自定义 BasePage class。我可以通过在 BasePage 上执行以下操作来使其正常工作,但它不一致:
public class BasePage ....
public static ServerRuntime runtime = new ServerRuntime("cayenne-config.xml");//This is in my BasePage class, but I've also tried this in the Application class
@Override
protected void init() {
BaseContext.bindThreadObjectContext(Application.runtime.getContext());//This is in my BasePage class
}
就像我说的那样,这种方法有效,但并不一致。我在
上不断收到错误消息
BaseContext.getThreadObjectContext();
错误是这样的:
java.lang.IllegalStateException: Current thread has no bound ObjectContext.
我似乎找不到太多这方面的信息。我试过做这样的事情,并使用它们访问运行时,但没有任何东西始终如一地工作。
WebUtil.setCayenneRuntime(this.getServletContext(), runtime);
BaseContext.bindThreadObjectContext(WebUtil.getCayenneRuntime(((Application)getApplication()).getServletContext()).getContext());
如有任何帮助,我们将不胜感激。
我自己想出了一个办法。
我正在扩展 CayenneFilter 并覆盖 init 方法。
在那里我几乎复制了他们的确切代码。我将能够在此处检查任何配置并加载正确的 xml 文件。这显然不是解决方案,但绝对是向前迈出的一步,并且可能是我最终这样做的方式。
无论哪种方式,这都是我测试过的有效方法。
@WebFilter(filterName = "cayenne-config", displayName = "cayenne-config", urlPatterns = {"/*"})
public class TestFilter extends CayenneFilter
{
@Override
public void init(FilterConfig config) throws ServletException
{
this.checkAlreadyConfigured(config.getServletContext());
this.servletContext = config.getServletContext();
WebConfiguration configAdapter = new WebConfiguration(config);
Collection modules = configAdapter.createModules(new Module[]{new WebModule()});
ServerRuntime runtime = new ServerRuntime("cayenne-test.xml", (Module[])modules.toArray(new Module[modules.size()]));
WebUtil.setCayenneRuntime(config.getServletContext(), runtime);
}
}
我认为不需要注释(我在 web.xml 文件中指定了所有注释),但我想我会把它留在这里,这样你就可以看到它正在发生变化。
如果我能找到一种方法来更改配置 (FilterConfig) 值(初始参数),那么我可以将其更改为我想使用的 xml 文件的名称,而不是覆盖它整个方法。我不知道该怎么做,但我稍后会进一步研究。
如果有人有更好的答案,我很想听听。
我有一个 Wicket 应用程序,我正在尝试实现可以远程更改的单独配置。无论如何,这是最终目标。
我想做的是通过手动启动 Cayenne 来设置它工作,而不是使用 web.xml 文件。我尝试了很多不同的东西,但我不确定我是否完全理解上下文是如何应用于所有线程的。
我已经尝试在我的应用程序中创建一个 ServerRuntime class。我还尝试了每个页面使用的自定义 BasePage class。我可以通过在 BasePage 上执行以下操作来使其正常工作,但它不一致:
public class BasePage ....
public static ServerRuntime runtime = new ServerRuntime("cayenne-config.xml");//This is in my BasePage class, but I've also tried this in the Application class
@Override
protected void init() {
BaseContext.bindThreadObjectContext(Application.runtime.getContext());//This is in my BasePage class
}
就像我说的那样,这种方法有效,但并不一致。我在
上不断收到错误消息BaseContext.getThreadObjectContext();
错误是这样的:
java.lang.IllegalStateException: Current thread has no bound ObjectContext.
我似乎找不到太多这方面的信息。我试过做这样的事情,并使用它们访问运行时,但没有任何东西始终如一地工作。
WebUtil.setCayenneRuntime(this.getServletContext(), runtime);
BaseContext.bindThreadObjectContext(WebUtil.getCayenneRuntime(((Application)getApplication()).getServletContext()).getContext());
如有任何帮助,我们将不胜感激。
我自己想出了一个办法。
我正在扩展 CayenneFilter 并覆盖 init 方法。
在那里我几乎复制了他们的确切代码。我将能够在此处检查任何配置并加载正确的 xml 文件。这显然不是解决方案,但绝对是向前迈出的一步,并且可能是我最终这样做的方式。
无论哪种方式,这都是我测试过的有效方法。
@WebFilter(filterName = "cayenne-config", displayName = "cayenne-config", urlPatterns = {"/*"})
public class TestFilter extends CayenneFilter
{
@Override
public void init(FilterConfig config) throws ServletException
{
this.checkAlreadyConfigured(config.getServletContext());
this.servletContext = config.getServletContext();
WebConfiguration configAdapter = new WebConfiguration(config);
Collection modules = configAdapter.createModules(new Module[]{new WebModule()});
ServerRuntime runtime = new ServerRuntime("cayenne-test.xml", (Module[])modules.toArray(new Module[modules.size()]));
WebUtil.setCayenneRuntime(config.getServletContext(), runtime);
}
}
我认为不需要注释(我在 web.xml 文件中指定了所有注释),但我想我会把它留在这里,这样你就可以看到它正在发生变化。
如果我能找到一种方法来更改配置 (FilterConfig) 值(初始参数),那么我可以将其更改为我想使用的 xml 文件的名称,而不是覆盖它整个方法。我不知道该怎么做,但我稍后会进一步研究。
如果有人有更好的答案,我很想听听。