我想将一个简单的Play(1.2.4)应用程序部署到WebSphere 8.我让应用程序在Windows上本地工作。两者都是Java 1.6。我使用:
创建了一个WAR文件play clean
play war --zip -o c:\sampleapp
然后修改生成的web.xml以定义我的服务器Datasource,再次构建war文件并进行部署。在部署期间,它从web.xml找到了我的resource-ref,并将其绑定到WAS定义的数据源。然后我将classloader顺序更改为“parent last”(基于Play部署选项页面和其他线程)。然后我没有错误地启动了应用程序。
我有一个类,它使用标记为@OnApplicationStart的方法扩展了play.jobs.Job。当我通过WAS控制台启动新安装的应用程序时,它会启动并执行此方法,该方法连接到数据源并加载一些数据并将其放入缓存中。
当我尝试访问我的第一个控制器时出现问题,我收到此错误:
[9/17/12 16:19:48:132 CDT] 00000022 servlet I com.ibm.ws.webcontainer.servlet.ServletWrapper init SRVE0242I: [sampleapp] [/sampleapp] [play]: Initialization successful.
[9/17/12 16:19:48:773 CDT] 00000022 SystemOut O 16:19:48,772 ERROR ~
@6bl9mfbm1
Internal Server Error (500)
Execution exception (In /app/controllers/Application.java around line 41)
RuntimeException occured : play.mvc.Scope$Session
play.exceptions.JavaExecutionException: play.mvc.Scope$Session
at play.mvc.ActionInvoker.invoke(ActionInvoker.java:231)
at play.server.ServletWrapper$ServletInvocation.execute(ServletWrapper.java:557)
at play.Invoker$Invocation.run(Invoker.java:278)
at play.server.ServletWrapper$ServletInvocation.run(ServletWrapper.java:548)
at play.Invoker.invokeInThread(Invoker.java:68)
at play.server.ServletWrapper.service(ServletWrapper.java:142)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:668)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1214)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:774)
at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:456)
at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:178)
at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1027)
at com.ibm.ws.webcontainer.webapp.WebApp.handleRequest(WebApp.java:3703)
at com.ibm.ws.webcontainer.webapp.WebGroup.handleRequest(WebGroup.java:304)
at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:962)
at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1662)
at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:195)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:452)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:511)
at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:305)
at com.ibm.ws.http.channel.inbound.impl.HttpICLReadCallback.complete(HttpICLReadCallback.java:83)
at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:165)
at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)
at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)
at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138)
at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204)
at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775)
at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:905)
at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1659)
Caused by: java.lang.RuntimeException: play.mvc.Scope$Session
at javassist.runtime.Desc.getClassType(Desc.java:156)
at javassist.runtime.Desc.getType(Desc.java:122)
at javassist.runtime.Desc.getType(Desc.java:78)
at controllers.Application.connected(Application.java:41)
at controllers.Application.index(Application.java:49)
at play.mvc.ActionInvoker.invokeWithContinuation(ActionInvoker.java:548)
at play.mvc.ActionInvoker.invoke(ActionInvoker.java:502)
at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:478)
at play.mvc.ActionInvoker.invokeControllerMethod(ActionInvoker.java:473)
at play.mvc.ActionInvoker.invoke(ActionInvoker.java:161)
... 28 more
这是我的相关控制器代码:
public class Application extends Controller {
@Before(unless={"login","index"})
static void addUser() {
User user = connected();
if(user != null) {
flash.put("user", user);
// renderArgs.put("user", user);
} else {
flash.error("Please log in.");
index();
}
}
static User connected() {
// if(renderArgs.get("user") != null) {
// return renderArgs.get("user", User.class);
// }
String username = session.get("user"); // Line 41 - Error!
if(username != null) {
return User.find("byUsername", username).first();
}
return null;
}
public static void index() {
if(connected() != null) {
Download.index(1);
}
render();
}
..
..
}
错误似乎来自会话引用。请注意,引用renderArgs的注释行在激活时也会导致类似的错误。
javassist在某处没有正确“增强”吗?我尝试用最新版本替换javassist jar,结果相同。
我正努力在这里玩“企业”,所以我真的很喜欢这个。截至2012年9月,我无法判断Play是否已成功运行WAS8。我会考虑Play 2(java),但似乎绝对不支持WAS,插件play2war看起来也没有WAS支持。愚蠢的是,如果没有WAS,我们就无法运行,但这是我们企业的现实。
更新:
我现在也尝试了Play 1.2.5并创建了一个新应用程序,并在Application.index方法中添加了一行session.get(“x”)。部署war文件并在首次访问时遇到相同的错误。
答案 0 :(得分:0)
也许这个问题可以通过调整WebSphere中的类加载器设置来解决。如果想到这一点会让你不寒而栗,并且你希望WAS能够完全摆脱困境,你可以尝试这种解决方法。
创建类似于此的启动作业:
@OnApplicationStart
public class Startup extends Job {
public void doJob() {
javassist.runtime.Desc.useContextClassLoader = true;
}
}