我在WebLogic 12c中运行我的Web服务时遇到问题(使用 OpenJPA 2.1.0 )。 Web服务的响应是具有特定实体列表的DTO。执行服务后,无法生成其响应(没有任何错误或异常)。我认为在MOXy的响应实体的解组操作期间存在问题(我在WebLogic 11中没有遇到任何问题,因为它不使用MOXy)。您如何看待这个问题和解决方案?
由于
Web服务在GlassFish 3.1.2中运行良好。
这是我的代码:
人员实体
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "person")
@Entity
@Table(name = "PERSON")
public class Person {
@Id
@Column(name = "ID")
@XmlElement(required = false)
private Long id;
@Column(name = "BIRTHDATE")
@XmlElement(required = false)
@Temporal(TemporalType.DATE)
private Date birthDate;
@Transient
private String name;
人员DTO
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "personDto")
public class PersonDto implements Serializable{
@XmlElement(required = false)
List<Person> persons;
/**
* list of person
*
* @return
*/
public List<Person> getPersons() {
if (persons == null)
persons = new LinkedList<Person>();
return persons;
}
public void setpersons(List<Person> persons) {
this.persons = persons;
}
的 DAO 的
@Stateless
public class PersonDaoImpl implements PersonDao{
@PersistenceContext(unitName = "pu-test")
private EntityManager em;
public List<Person> findAll() {
List<Person> personList = null;
Query query = em.createNamedQuery("person.findAll");
List<Person> results = (List<Person>)query.getResultList();
return results;
}
的 orm.xml中 的
<named-query name="person.findAll">
<query>select p from Person p</query>
</named-query>
的的WebService 的
@Stateless
@WebService
public class PersonServiceImpl implements IPersonService {
@EJB
private PersonDao personDao;
public PersonDto allPersons() {
PersonDto result = new PersonDto();
List<Person> fList = personDao.findAll();
result.setPersons(fList);
return result;
}
列表的大小为3,但没有回复。
答案 0 :(得分:0)
<强>更新强>
问题似乎是OpenJPA填充了java.util.Date
类型的属性,其子类为java.util.Date
。我打开了以下EclipseLink错误,您可以使用它来跟踪我们在此问题上的进展:
我已经发布了一种方法来解决这个问题,我在这里给出了相关问题的答案:
要获得官方补丁,您应该提交WebLogic错误。如果您引用我上面提到的EclipseLink错误,它将有助于更快地移动所有内容。
EclipseLink JAXB (MOXy)确实成为WebLogic 12.1.1中的默认JAXB提供程序(请参阅EclipseLink MOXy is the JAXB Provider in WebLogic Server 12c),但这似乎不是导致问题的原因。
<强> PersonServiceImpl 强>
我简化了您的服务以尽可能多地删除与MOXy无关的服务。通过删除@Stateless
注释,我可以使服务正常工作。我建议联系Oracle支持人员,了解WebLogic 12.1.1和GlassFish 3.1.2之间的行为差异。
package forum10967587;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.ejb.*;
import javax.jws.WebMethod;
import javax.jws.WebService;
//@Stateless
@WebService
public class PersonServiceImpl implements IPersonService {
@WebMethod
public PersonDto allPersons() {
PersonDto result = new PersonDto();
List<Person> fList = new ArrayList<Person>(3);
Person p1 = new Person();
p1.setBirthDate(new Date());
p1.setId(1L);
p1.setName("Jane");
fList.add(p1);
Person p2 = new Person();
p2.setBirthDate(new Date());
p2.setId(2L);
p2.setName("John");
fList.add(p2);
result.setPersons(fList);
return result;
}
}
测试客户端结果
以下是从WebLogic管理控制台运行内置测试客户端时收到的输出。
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<ns0:allPersonsResponse xmlns:ns0="http://forum10967587/">
<return>
<persons>
<id>1</id>
<birthDate>2012-06-19T13:56:38.579</birthDate>
<name>Jane</name>
</persons>
<persons>
<id>2</id>
<birthDate>2012-06-19T13:56:38.579</birthDate>
<name>John</name>
</persons>
</return>
</ns0:allPersonsResponse>
</S:Body>
</S:Envelope>
答案 1 :(得分:0)
最后,通过将JAXB实现从Moxy更改为Metro,我的问题已经暂时解决了。应该在&#34; / weblogic_home / wlserver / endorsed&#34;的路径中添加两个jar文件javax-xml-bind.jar,javax-xml-ws.jar;在Weblogic服务器中,还将以下属性添加到setDomainEnv文件的java_properties部分中:
-Dcom.sun.xml.ws.spi.db.BindingContextFactory=com.sun.xml.ws.db.
glassfish.JAXBRIContextFactory
-Djavax.xml.bind.JAXBContext=org.eclipse.persistence.jaxb.JAXBContextFactory