0

我有一个 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”类型。如何解决这个问题呢?

4

1 回答 1

0

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

具体类必须由两个应用程序共享。也就是说,共享会话不是标准的,应该避免。考虑将其作为单个应用程序,或将要在应用程序之间共享的数据存储在共享数据库中。

于 2013-07-16T10:40:56.950 回答