Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/392.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在同一Tomcat容器中共享web服务和servlet的会话属性_Java_Web Services_Session_Tomcat7_Classcastexception - Fatal编程技术网

Java 在同一Tomcat容器中共享web服务和servlet的会话属性

Java 在同一Tomcat容器中共享web服务和servlet的会话属性,java,web-services,session,tomcat7,classcastexception,Java,Web Services,Session,Tomcat7,Classcastexception,我有一个servlet,其中我将对象存储到ServletContext的属性存储中: @WebServlet(name = "MainTestServlet", urlPatterns = {"/MainTestServlet"}) public class MainTestServlet extends HttpServlet { protected void processRequest(HttpServletRequest request, HttpServletResponse

我有一个servlet,其中我将对象存储到ServletContext的属性存储中:

@WebServlet(name = "MainTestServlet", urlPatterns = {"/MainTestServlet"})
public class MainTestServlet extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {        
        IFStoreCredentials creds = new StoreCreds();
        this.getServletContext().setAttribute("creds2", creds);   
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        processRequest(request, response);
    }
}
此对象(IFStoreCredentials)应可在同一Tomcat容器实例中运行的其他Web服务应用程序中访问:

@WebService(serviceName = "TestWebService")
public class TestWebService {
    @Resource
    private WebServiceContext context;
    @WebMethod(operationName = "hello")
    public String hello(@WebParam(name = "name") String txt) {       
        ServletContext servletContext =
                (ServletContext) context.getMessageContext().get(
                        MessageContext.SERVLET_CONTEXT);        
        IFStoreCredentials creds = (IFStoreCredentials) servletContext.getContext("/TestServlet").getAttribute("creds2");       
        return "Hello " + creds.getUserName() + " !";
    }
}
因为这两个web应用程序不知道共享类名,所以我创建了一个外部库,该库应充当接口:

package com.data.credentials.manager;

public interface IFStoreCredentials {    
    public String getUserName();    
    public String getPassword();
}
我将这个库包含在每个应用程序中,并在一个具体的类中实现接口

问题是要知道,使用的不是每个应用程序已知的接口,而是具体的类名。如果执行Web服务方法,我得到一个ClassCastException:

 test.main.StoreCreds cannot be cast to com.data.credentials.manager.IFStoreCredentials
java.lang.ClassCastException: test.main.StoreCreds cannot be cast to com.data.credentials.manager.IFStoreCredentials
    at com.test.webservice.TestWebService.hello(TestWebService.java:30)
问题:
为什么会引发此类强制转换异常?我已经创建了一个应该使用的接口,但似乎该对象仍然来自类型“test.main.StoreCreds”。如何解决这个问题?

您的类
test.main.StoreCreds
实现了一个接口
com.data.credentials.manager.IFStoreCredentials
这一事实不会改变您的对象仍然是具体
test.main.StoreCreds
的实例这一事实。如果wabapp不知道这个具体的类,它就不能使用这种类型的对象,因为它找不到对象的类的字节码,这显然是使用它所需要的


具体类必须由两个应用程序共享。也就是说,共享会话不是标准的,应该避免。考虑把它变成一个单独的应用程序,或者在共享数据库中存储你想在应用程序之间共享的数据。我刚刚将conrete类包含到共享库中,并从这个库类创建了一个对象,结果是:“java.lang.ClassCastException:com.data.credentials.manager.StoreCredentialsVo不能强制转换为com.data.credentials.manager.StoreCredentialsVo”。在com.test.webservice.TestWebService.hello(TestWebService.java:31)上,这是有意义的。现在,会话中存储了该类的一个实例,该实例由第一个webapp的类加载器提供。然后尝试将其强制转换为由第二个webapp的类加载器加载的a类。该类应该由公共类加载器加载,并且仅此加载器加载。看见或者更好:不要在webapps之间共享会话。好的。非常感谢。然后是最后一个问题。如何让tomcat类加载器加载这个类?我将jar文件放入tomcat主文件夹的“lib”目录中。但似乎根本没有加载库。如果文档是正确的,那么应该加载它。确保使用标准启动脚本启动Tomcat,不要使用IDE或其他方式,因为它们可能有一组jar的过时副本。当然,但是如果没有IDE(目前还不能识别jar文件),如何编译和部署应用程序?似乎我必须找到另一种方法,将两个应用程序放在一起,以摆脱会话共享。