Я застрял в раскрытии веб-службы с помощью 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;
}
}
Помогите мне решить эту проблему. Заранее спасибо.
Привет Карстен, мне нужно более подробно об этом. Пожалуйста помоги. Я получил от вас ответ: нам нужно вызвать метод getter Collection, прежде чем он вернет объект Form. Это так ??? Благодарю. –
Да, это примерно право. Вы должны инициализировать коллекцию перед выходом из сеанса/транзакции, вызвав Hibernate.initialize (Form.getAnyCollection()); По крайней мере, это то, что сработало для меня. – Carsten