2013-05-28 2 views
1

Я застрял в раскрытии веб-службы с помощью JAX-WS. Проблема возникает из-за того, что JAXB пытается сериализовать объект после спящего режима, закрывая сеанс. Я Google в течение последних двух дней, но не смог найти правильный ответ. Ниже приведены некоторые решения, данные другими.не удалось инициализировать прокси - нет сеанса в jax-ws + hibernate

  • Нетерпеливый нагрузки объектов
  • Использовать обычные @XmlTransient
  • SOAPHandler но не завершена ответа

Вот сценарий подробно. Я написал один модельный класс, который имеет число связей @OneTOMany, отношения @ManyToOne и отношения @OneToOne. В результате веб-служба возвращает объект этого класса. Когда я вызываю службу через SOAP UI, он дает мне следующее сообщение об ошибке.

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> 
    <S:Body> 
     <S:Fault xmlns:ns4="http://www.w3.org/2003/05/soap-envelope"> 
     <faultcode>S:Server</faultcode> 
     <faultstring>could not initialize proxy - no Session</faultstring> 
     </S:Fault> 
    </S:Body> 
</S:Envelope> 

Модель класса (без добытчиками и сеттеров) интерфейс

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlRootElement 
@Entity 
@AttributeOverrides({ @AttributeOverride(name = "id", column = @Column(name = "mas_form_id")), 
     @AttributeOverride(name = "tenantId", column = @Column(name = "mas_form_tenant_id")) }) 
@FilterDef(name = "tenantFilter", parameters = @ParamDef(name = "tenantIdParam", type = "string")) 
@Filters(@Filter(name = "tenantFilter", condition = "mas_form_tenant_id = :tenantIdParam")) 
@Table(name = "mas_form") 
public class Form extends BaseRevolution { 

    @Column(name = "mas_form_action") 
    private String formAction; 
    @Column(name = "mas_form_is_active") 
    private boolean isActive; 
    @Column(name = "mas_form_is_lock") 
    private boolean isLock; 
    @ManyToOne 
    @JoinColumn(name = "mas_ft_id") 
    private FormType formType; 
    @OneToMany(fetch = FetchType.LAZY, mappedBy = FORM) 
    private List<FormQuestion> formQuestions = new ArrayList<FormQuestion>(0); 
    @OneToMany(fetch = FetchType.LAZY, mappedBy = FORM) 
    @LazyCollection(LazyCollectionOption.FALSE) 
    private Set<DocumentRequired> documentRequiredSet = new HashSet<DocumentRequired>(0); 
    @OneToMany(fetch = FetchType.LAZY, mappedBy = FORM) 
    private List<Application> applications = new ArrayList<Application>(0); 
    @OneToMany(fetch = FetchType.LAZY, mappedBy = FORM) 
    @LazyCollection(LazyCollectionOption.FALSE) 
    private List<FormField> formFields = new ArrayList<FormField>(0); 
    @OneToMany(fetch = FetchType.LAZY, mappedBy = FORM) 
    private List<FormCharge> formCharges = new ArrayList<FormCharge>(0); 
    @Column(name = "mas_form_method") 
    private String formMethod; 
    @OneToMany(fetch = FetchType.LAZY, mappedBy = FORM) 
    private List<FormFieldGroup> formFieldGroup; 
    @Column(name = "mas_form_name_en") 
    private String formNameEn; 
    @Column(name = "mas_form_name_si") 
    private String formNameSi; 
    @Column(name = "mas_form_name_ta") 
    private String formNameTa; 
    @OneToOne(fetch = FetchType.EAGER) 
    @JoinColumn(name = "activity") 
    private ElgActivity elgActivity; 
    @Column(name = "description", nullable = true, length = 1000) 
    private String description; 

    //getters and setters 

} 

Веб-сервис

@WebService(name = "formWebServicePort", targetNamespace = "http://lk.gov.elg/core/ws/form/") 
public interface FormWebService { 

    @WebMethod(operationName = "getAllFormsWithDocumentReferences", action = "urn:GetAllFormsWithDocumentReferences") 
    @SOAPBinding(parameterStyle = SOAPBinding.ParameterStyle.WRAPPED) 
    @WebResult(name = "formsWithDocumentReferences") 
    List<Form> getAllFormsWithDocumentReferences(
      @WebParam(name = "tenantId", targetNamespace = "http://lk.gov.elg/core/ws/form/") String tenantId, 
      @WebParam(name = "categoryName", targetNamespace = "http://lk.gov.elg/core/ws/form/") String categoryName); 
} 

реализация веб-службы

@SchemaValidation 
@WebService(targetNamespace = "http://lk.gov.elg/core/ws/form/", endpointInterface = "lk.gov.elg.core.ws.citizen.FormWebService") 
public class FormWebServiceImpl extends SpringBeanAutowiringSupport implements FormWebService { 

    private static final Logger logger = LoggerFactory.getLogger(FormWebServiceImpl.class); 
    @Autowired 
    private FormService formService; 

    @Override 
    public List<Form> getAllFormsWithDocumentReferences(
      @WebParam(name = "tenantId", targetNamespace = "http://lk.gov.elg/core/ws/form/") String tenantId, 
      @WebParam(name = "categoryName", targetNamespace = "http://lk.gov.elg/core/ws/form/") String categoryName) { 

     List<Form> formList = formService.getAllFormsWithDocRefs(tenantId, categoryName); 
     return formList; 
    } 
} 

Помогите мне решить эту проблему. Заранее спасибо.

ответ

0

Вы пытались инициализировать сборники объекта Form перед выходом из сеанса. Это приведет к загрузке коллекций. Поэтому в основном он должен делать то же самое, что и при загрузке, но какая-то интересная загрузка не всегда помогает. В случае необходимости, я смогу узнать подробности об этом позже или завтра.

+0

Привет Карстен, мне нужно более подробно об этом. Пожалуйста помоги. Я получил от вас ответ: нам нужно вызвать метод getter Collection, прежде чем он вернет объект Form. Это так ??? Благодарю. –

+0

Да, это примерно право. Вы должны инициализировать коллекцию перед выходом из сеанса/транзакции, вызвав Hibernate.initialize (Form.getAnyCollection()); По крайней мере, это то, что сработало для меня. – Carsten

0

Просто идея: мы недавно преодолели это путем добавления (EJB3) метод перехватчика к SessionBean (мы используем JBoss7):

@javax.interceptor.AroundInvoke 
public Object intercept(InvocationContext ctx) throws Exception { 
     Object result = ctx.proceed(); 

     // Add code here to inspect the result and initialize all collections. 

     return result; 
} 
Смежные вопросы