【问题标题】:my webService doesn't return a correct response for SOAP because of a lazy initialize exception由于延迟初始化异常,我的 webService 没有返回正确的 SOAP 响应
【发布时间】:2019-01-31 12:07:24
【问题描述】:

我有一个正在运行的网络服务,我可以在正确的 url 上阅读我的 wsdl。 我也有我的服务、模型和消费者,因为当我使用调试模式发送请求时,我会从我的数据库中看到结果。 但是,当我的 WebMethod 返回结果时,我只有一个空响应和 glassfish 日志中的错误,它说: 未能延迟初始化角色集合:p3.model.book.Book.borrowing,无法初始化代理 - 没有会话

我认为这是我借用的延迟加载,但似乎不是那样。

[2019-01-31T12:53:50.804+0100] [glassfish 5.0] [严重] [] [com.sun.xml.ws.servlet.http] [tid: _ThreadID=32 _ThreadName=http-listener- 1(1)] [timeMillis:1548935630804] [levelValue:1000] [[ 抓到可扔的 org.hibernate.LazyInitializationException:无法延迟初始化角色集合:p3.model.book.Book.borrowing,无法初始化代理 - 没有会话 在 org.hibernate.collection.internal.AbstractPersistentCollection.throwLazyInitializationException(AbstractPersistentCollection.java:602) 在 org.hibernate.collection.internal.AbstractPersistentCollection.withTemporarySessionIfNeeded(AbstractPersistentCollection.java:217) 在 org.hibernate.collection.internal.AbstractPersistentCollection.initialize(AbstractPersistentCollection.java:581) 在 org.hibernate.collection.internal.AbstractPersistentCollection.read(AbstractPersistentCollection.java:148) 在 org.hibernate.collection.internal.PersistentBag.iterator(PersistentBag.java:303) 在 com.sun.xml.bind.v2.runtime.reflect.Lister$CollectionLister.iterator(Lister.java:281) 在 com.sun.xml.bind.v2.runtime.reflect.Lister$CollectionLister.iterator(Lister.java:268) 在 com.sun.xml.bind.v2.runtime.property.ArrayElementProperty.serializeListBody(ArrayElementProperty.java:133) 在 com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:159) 在 com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:360) 在 com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:696) 在 com.sun.xml.bind.v2.runtime.property.ArrayElementNodeProperty.serializeItem(ArrayElementNodeProperty.java:69) 在 com.sun.xml.bind.v2.runtime.property.ArrayElementProperty.serializeListBody(ArrayElementProperty.java:172) 在 com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:159) 在 com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:360) 在 com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:696) 在 com.sun.xml.bind.v2.runtime.property.ArrayElementNodeProperty.serializeItem(ArrayElementNodeProperty.java:69) 在 com.sun.xml.bind.v2.runtime.property.ArrayElementProperty.serializeListBody(ArrayElementProperty.java:172) 在 com.sun.xml.bind.v2.runtime.property.ArrayERProperty.serializeBody(ArrayERProperty.java:159) 在 com.sun.xml.bind.v2.runtime.ClassBeanInfoImpl.serializeBody(ClassBeanInfoImpl.java:360) 在 com.sun.xml.bind.v2.runtime.XMLSerializer.childAsXsiType(XMLSerializer.java:696) 在 com.sun.xml.bind.v2.runtime.MarshallerImpl.write(MarshallerImpl.java:276) 在 com.sun.xml.bind.v2.runtime.BridgeImpl.marshal(BridgeImpl.java:104) 在 com.sun.xml.bind.api.Bridge.marshal(Bridge.java:145) 在 com.sun.xml.ws.db.glassfish.BridgeWrapper.marshal(BridgeWrapper.java:176) 在 com.sun.xml.ws.message.jaxb.JAXBMe​​ssage.writePayloadTo(JAXBMe​​ssage.java:415) 在 com.sun.xml.ws.message.AbstractMessageImpl.writeTo(AbstractMessageImpl.java:192) 在 com.sun.xml.ws.api.message.MessageWrapper.writeTo(MessageWrapper.java:226) 在 com.sun.xml.ws.encoding.StreamSOAPCodec.encode(StreamSOAPCodec.java:144) 在 com.sun.xml.ws.encoding.SOAPBindingCodec.encode(SOAPBindingCodec.java:242) 在 com.sun.xml.ws.transport.http.HttpAdapter.encodePacket(HttpAdapter.java:636) 在 com.sun.xml.ws.transport.http.HttpAdapter.access$100(HttpAdapter.java:108) 在 com.sun.xml.ws.transport.http.HttpAdapter$3.onCompletion(HttpAdapter.java:739) 在 com.sun.xml.ws.server.WSEndpointImpl$1.onCompletion(WSEndpointImpl.java:357) 在 com.sun.xml.ws.api.pipe.Fiber.completionCheck(Fiber.java:927) 在 com.sun.xml.ws.api.pipe.Fiber.run(Fiber.java:823) 在 com.sun.xml.ws.api.pipe.Fiber.start(Fiber.java:420) 在 com.sun.xml.ws.server.WSEndpointImpl.processAsync(WSEndpointImpl.java:368) 在 com.sun.xml.ws.server.WSEndpointImpl.process(WSEndpointImpl.java:398) 在 com.sun.xml.ws.metro.api.config.management.ManagedEndpoint.process(ManagedEndpoint.java:234) 在 com.sun.xml.ws.transport.http.HttpAdapter.invokeAsync(HttpAdapter.java:734) 在 com.sun.xml.ws.transport.http.servlet.ServletAdapter.invokeAsync(ServletAdapter.java:212) 在 com.sun.xml.ws.transport.http.servlet.WSServletDelegate.doGet(WSServletDelegate.java:161) 在 com.sun.xml.ws.transport.http.servlet.WSServletDelegate.doPost(WSServletDelegate.java:197) 在 com.sun.xml.ws.transport.http.servlet.WSServlet.doPost(WSServlet.java:81) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:706) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:791) 在 org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1580) 在 org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:258) 在 org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160) 在 org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:652) 在 org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:591) 在 com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99) 在 org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:155) 在 org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:371) 在 org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:238) 在 com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:463) 在 com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:168) 在 org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:206) 在 org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:180) 在 org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:242) 在 org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119) 在 org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:284) 在 org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:201) 在 org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:133) 在 org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:112) 在 org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77) 在 org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:539) 在 org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112) 在 org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117) 在 org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56) 在 org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137) 在 org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:593) 在 org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:573) 在 java.lang.Thread.run(Thread.java:748) ]]

我的wsdl暴露了:

This XML file does not appear to have any style information associated with it. The document tree is shown below.
<!--
 Published by JAX-WS RI (http://jax-ws.java.net). RI's version is Metro/2.4.0 (wsit240-7e98ff4; 2017-08-03T21:19:54+0200) JAXWS-RI/2.3.0 JAXWS-API/2.3.0 JAXB-RI/2.3.0 JAXB-API/2.3.0 svn-revision#unknown. 
-->
<!--
 Generated by JAX-WS RI (http://javaee.github.io/metro-jax-ws). RI's version is Metro/2.4.0 (wsit240-7e98ff4; 2017-08-03T21:19:54+0200) JAXWS-RI/2.3.0 JAXWS-API/2.3.0 JAXB-RI/2.3.0 JAXB-API/2.3.0 svn-revision#unknown. 
-->
<definitions xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" xmlns:wsp="http://www.w3.org/ns/ws-policy" xmlns:wsp1_2="http://schemas.xmlsoap.org/ws/2004/09/policy" xmlns:wsam="http://www.w3.org/2007/05/addressing/metadata" xmlns:soap="http://schemas.xmlsoap.org/wsdl/soap/" xmlns:tns="http://webService2.p3/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="http://schemas.xmlsoap.org/wsdl/" targetNamespace="http://webService2.p3/" name="workWeb">
<types>
<xsd:schema>
<xsd:import namespace="http://webService2.p3/" schemaLocation="http://localhost:8080/library-webservice/workWs?xsd=1"/>
</xsd:schema>
</types>
<message name="init">
<part name="parameters" element="tns:init"/>
</message>
<message name="initResponse">
<part name="parameters" element="tns:initResponse"/>
</message>
<message name="searchEngineWorkByTitleAndAuthor">
<part name="parameters" element="tns:searchEngineWorkByTitleAndAuthor"/>
</message>
<message name="searchEngineWorkByTitleAndAuthorResponse">
<part name="parameters" element="tns:searchEngineWorkByTitleAndAuthorResponse"/>
</message>
<message name="searchEngineWorkByTitle">
<part name="parameters" element="tns:searchEngineWorkByTitle"/>
</message>
<message name="searchEngineWorkByTitleResponse">
<part name="parameters" element="tns:searchEngineWorkByTitleResponse"/>
</message>
<message name="searchEngineWorkByAuthor">
<part name="parameters" element="tns:searchEngineWorkByAuthor"/>
</message>
<message name="searchEngineWorkByAuthorResponse">
<part name="parameters" element="tns:searchEngineWorkByAuthorResponse"/>
</message>
<portType name="workWs">
<operation name="init">
<input wsam:Action="http://webService2.p3/workWs/initRequest" message="tns:init"/>
<output wsam:Action="http://webService2.p3/workWs/initResponse" message="tns:initResponse"/>
</operation>
<operation name="searchEngineWorkByTitleAndAuthor">
<input wsam:Action="http://webService2.p3/workWs/searchEngineWorkByTitleAndAuthorRequest" message="tns:searchEngineWorkByTitleAndAuthor"/>
<output wsam:Action="http://webService2.p3/workWs/searchEngineWorkByTitleAndAuthorResponse" message="tns:searchEngineWorkByTitleAndAuthorResponse"/>
</operation>
<operation name="searchEngineWorkByTitle">
<input wsam:Action="http://webService2.p3/workWs/searchEngineWorkByTitleRequest" message="tns:searchEngineWorkByTitle"/>
<output wsam:Action="http://webService2.p3/workWs/searchEngineWorkByTitleResponse" message="tns:searchEngineWorkByTitleResponse"/>
</operation>
<operation name="searchEngineWorkByAuthor">
<input wsam:Action="http://webService2.p3/workWs/searchEngineWorkByAuthorRequest" message="tns:searchEngineWorkByAuthor"/>
<output wsam:Action="http://webService2.p3/workWs/searchEngineWorkByAuthorResponse" message="tns:searchEngineWorkByAuthorResponse"/>
</operation>
</portType>
<binding name="workWsPortBinding" type="tns:workWs">
<soap:binding transport="http://schemas.xmlsoap.org/soap/http" style="document"/>
<operation name="init">
<soap:operation soapAction=""/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
<operation name="searchEngineWorkByTitleAndAuthor">
<soap:operation soapAction=""/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
<operation name="searchEngineWorkByTitle">
<soap:operation soapAction=""/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
<operation name="searchEngineWorkByAuthor">
<soap:operation soapAction=""/>
<input>
<soap:body use="literal"/>
</input>
<output>
<soap:body use="literal"/>
</output>
</operation>
</binding>
<service name="workWeb">
<port name="workWsPort" binding="tns:workWsPortBinding">
<soap:address location="http://localhost:8080/library-webservice/workWs"/>
</port>
</service>
</definitions>

我的模型:

package p3.model.book;

import p3.model.borrowing.Borrowing;
import p3.model.work.Work;

import java.io.Serializable;
import java.util.List;

import javax.persistence.*;
import javax.xml.bind.annotation.XmlType;

@Entity
@Table(name = "book")
@XmlType(name = "Book")
public class Book implements Serializable {

    @Id
    @GeneratedValue(generator = "gen_book", strategy = GenerationType.IDENTITY)
    @SequenceGenerator(name = "gen_book", sequenceName = "seq_book", allocationSize = 1)
    Integer id;

    private String referenceCode;

    private boolean isAvailable;

    @ManyToOne
    private Work works;

    @OneToMany
    private List<Borrowing> borrowing;

    public Book(String referenceCode, boolean isAvailable) {
        this.referenceCode = referenceCode;
        this.isAvailable = isAvailable;
    }

    public Book(String referenceCode, boolean isAvailable, Work works) {
        this.referenceCode = referenceCode;
        this.isAvailable = isAvailable;
        this.works = works;
    }

    public Book() {
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getReferenceCode() {
        return referenceCode;
    }

    public void setReferenceCode(String referenceCode) {
        this.referenceCode = referenceCode;
    }

    public boolean isAvailable() {
        return isAvailable;
    }

    public void setAvailable(boolean isAvailable) {
        this.isAvailable = isAvailable;
    }

    public Work getWorks() {
        return works;
    }

    public void setWorks(Work works) {
        this.works = works;
    }

    public List<Borrowing> getBorrowing() {
        return borrowing;
    }

    public void setBorrowing(List<Borrowing> borrowing) {
        this.borrowing = borrowing;
    }
}

在我的调试模式下,我遇到了这个问题,我不知道如何解决它:

debug before response returned

有人有想法吗?

感谢您阅读并帮助我。

亚历山大。

【问题讨论】:

  • “我认为这是我借用的延迟加载,但似乎不是那样。”异常消息会提示其他情况。
  • 最后,经过多次尝试,我发现我的 f..g 麻烦。这是我的模型,它有注释 OneToMany 和 ManyToOne,当我问一些问题时,下载了一个列表,但我没有 SOAP 的良好格式,所以客户端不理解正确的数据格式。 (如果我不清楚,我仍然发布我的解决方案)
  • 避免此类麻烦的最佳方法是在 manytoOne 或 oneToMany 两侧的属性询问上添加 @JsonIgnoreProperties

标签: spring web-services soap spring-data glassfish


【解决方案1】:

我解决了像这样修改模型的问题:(删除注释)

package p3.model.book;

import p3.model.work.Work;

import java.io.Serializable;
import java.util.List;

import javax.persistence.*;
import javax.xml.bind.annotation.XmlType;

@Entity
@Table(name = "book")
//@XmlType(name = "Book")
public class Book implements Serializable {

    @Id
    @GeneratedValue(generator = "gen_book", strategy = GenerationType.IDENTITY)
    @SequenceGenerator(name = "gen_book", sequenceName = "seq_book", allocationSize = 1)
    Integer id;

    private String referenceCode;

    private boolean isAvailable;



    public Book(String referenceCode, boolean isAvailable) {
        this.referenceCode = referenceCode;
        this.isAvailable = isAvailable;
    }

    public Book() {
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getReferenceCode() {
        return referenceCode;
    }

    public void setReferenceCode(String referenceCode) {
        this.referenceCode = referenceCode;
    }

    public boolean isAvailable() {
        return isAvailable;
    }

    public void setAvailable(boolean isAvailable) {
        this.isAvailable = isAvailable;
    }


}

【讨论】:

    猜你喜欢
    • 2012-07-27
    • 1970-01-01
    • 2014-03-21
    • 2012-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多