创建JAX-WS web服务时未映射Hibernate对象



我正在用Eclipse IDE用Java生成一个web服务,该服务有一个类,其中包含通过Hibernate映射的DAO查询数据库的方法。如果我在不使用所有Hibernate类型(作为传递给方法的参数或返回类型)的情况下创建web服务,它会成功;如果我试图使用所有Hibernatebean来映射它们,它会失败。以前有人遇到过这个问题吗?

问题是我没有将所有Hibernate对象映射到web服务中。当然没有,当我需要由使用该服务的客户使用它们时,它们的使用量不足。

有人面临这个问题吗?

谢谢,我很感激任何帮助。。。

在我的例子中,下面类的第一个方法"mapVM"返回一组"VmStatistics",导致如下错误:

An internal error occurred during: "Generating JAX-WS Web Services".
Unable to create JAXBContext

而如果我将方法从Hibernate对象中删除,则在创建ws时不会映射"VmStatistics"。其他对象也是如此,所以我在ws-中缺少bean

hibernate逻辑在一个jar文件中,包含6个bean。

这是我为生成WS的类(包含5个方法)

   public class DBHelper {
    public DBHelper(){}
          public static Set<VmStatistics> mapVM(Vm vm){
        Set< VmStatistics> s = vm.getVmStatisticses();
        return s;
    }

    /**
     * Loads all companies
     * 
     * @return A list of company objects
     */
    public static ArrayList<Company> getCompanyList(){
        ArrayList<Company> lCompanies = new ArrayList<Company>();
                    ...
                    return lCompanies;
    }
    /**
     * Loads all the available countries
     * 
     * @return
     * Returns a list of string objects
     */
    public static ArrayList<String> getCountryList(){
        ArrayList<String> lCountires = new ArrayList<String>();
        ...     
                    return lCountires;
    }
    /**
     * Loads the companies of the given country name
     * 
     * @param pCountry a given country name
     * 
     * @return A list of company objects
     */
    public static ArrayList<Company> getCompanyListByCountry(String pCountry){
        ArrayList<Company> lCompanies = new ArrayList<Company>();
                    ...
                    return lCompanies;
    }
    /**
     * Loads the latest reading performed in the datacenter
     * 
     * @param pCountry
     * A given country name
     * 
     * @param pCompany
     * A given company object
     * 
     * @return The list of server objects which contains the associated VMs and the relative statistics
     */
    public static Collection<Server> getCurrentReading(String pCountry, Company pCompany){
                 ...
                return lServer;
    }
}

现在,我尝试在ws的模式文件和wsdl中手动添加bean,它接受了它,但在tomcat部署阶段,它给出了相同的错误,但由于这是一个日志错误,而不是eclipse,我认为更清楚地理解:

我试图通过修改sdl和模式文件并添加未映射的类型来手动生成。。。在tomcat face上的部署中,它给出了相同的错误。。。也许这会更清楚,因为这是一个日志错误:

SEVERE: WSSERVLET11: failed to parse runtime descriptor: javax.xml.ws.WebServiceException: Unable to create JAXBContext
javax.xml.ws.WebServiceException: Unable to create JAXBContext
    at com.sun.xml.ws.model.AbstractSEIModelImpl.createJAXBContext(AbstractSEIModelImpl.java:158)
    at com.sun.xml.ws.model.AbstractSEIModelImpl.postProcess(AbstractSEIModelImpl.java:87)
    at com.sun.xml.ws.model.RuntimeModeler.buildRuntimeModel(RuntimeModeler.java:262)
    at com.sun.xml.ws.server.EndpointFactory.createSEIModel(EndpointFactory.java:322)
    at com.sun.xml.ws.server.EndpointFactory.createEndpoint(EndpointFactory.java:188)
    at com.sun.xml.ws.api.server.WSEndpoint.create(WSEndpoint.java:467)
    at com.sun.xml.ws.transport.http.DeploymentDescriptorParser.parseAdapters(DeploymentDescriptorParser.java:253)
    at com.sun.xml.ws.transport.http.DeploymentDescriptorParser.parse(DeploymentDescriptorParser.java:147)
    at com.sun.xml.ws.transport.http.servlet.WSServletContextListener.contextInitialized(WSServletContextListener.java:108)
    at org.apache.catalina.core.StandardContext.listenerStart(StandardContext.java:3843)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4342)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:791)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:771)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:525)
    at org.apache.catalina.startup.HostConfig.deployWAR(HostConfig.java:830)
    at org.apache.catalina.startup.HostConfig.deployWARs(HostConfig.java:719)
    at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:490)
    at org.apache.catalina.startup.HostConfig.start(HostConfig.java:1149)
    at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:311)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:117)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1053)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:719)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045)
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443)
    at org.apache.catalina.core.StandardService.start(StandardService.java:516)
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:710)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:578)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413)
Caused by: java.security.PrivilegedActionException: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
java.sql.Timestamp does not have a no-arg default constructor.
    this problem is related to the following location:
        at java.sql.Timestamp
        at public java.sql.Timestamp org.qcri.power.db.AbstractServerStatistics.getTimestamp()
        at org.qcri.power.db.AbstractServerStatistics
        at org.qcri.power.db.ServerStatistics
        at private java.util.Set org.qcri.power.ws.jaxws.MapServerResponse._return
        at org.qcri.power.ws.jaxws.MapServerResponse
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.xml.ws.model.AbstractSEIModelImpl.createJAXBContext(AbstractSEIModelImpl.java:148)
    ... 32 more

谢谢你,

通过添加@XmlJavaTypeAdapter( TimestampAdapter.class) BUT,通过创建TimestampAdapter类使其返回java.util.Date而不是java.sql.Date 来解决问题

最新更新