【问题标题】:MOXy unmarshalling in Weblogic 12Weblogic 12 中的 MOXy 解组
【发布时间】:2012-06-13 14:51:42
【问题描述】:

我在 WebLogic 12c(使用 OpenJPA 2.1.0)中运行我的 Web 服务时遇到问题。 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>

网络服务

@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,但没有响应。

【问题讨论】:

  • 我是 EclipseLink JAXB (MOXy) 负责人,您能否提供有关您的用例的更多信息?
  • 感谢您的回复。我添加了我的源代码。如果你愿意,我可以发项目的ear文件。

标签: java weblogic eclipselink moxy weblogic12c


【解决方案1】:

更新

问题似乎是 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 注释,我可以让服务正常工作。我建议就 WebLogic 12.1.1 和 GlassFish 3.1.2 之间的行为差​​异联系 Oracle 支持。

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>

【讨论】:

  • 是的,我还是有同样的问题。
  • 我之前修改了和你一样的代码,即我注释了DAO find 方法并用常量值填充列表,但我没有注释@Stateless。这样,Web 服务就起作用了。我认为问题与将检索到的对象转换为 xml 有关。
  • 请尝试使用 JPA 而不是常量值进行测试。
  • 我发现了问题。这与 java.util.Date 有关。当我将@XmlTransient 放在birthDate 字段上时,响应生成正确。我使用@XmlJavaTypeAdapter(DateAdapter.class) 来解决问题。还有其他方法可以解决日期转换问题吗?
  • 当我将 java.util.Date 更改为 java.sql.Date 时,编组将正确完成。我认为 moxy 不支持 java.util.Date
【解决方案2】:

最后,通过将 JAXB 实现从 Moxy 更改为 Metro,我的问题暂时得到了解决。两个jar文件javax-xml-bind.jar,javax-xml-ws.jar应该添加到Weblogic服务器的“/weblogic_home/wlserver/endorsed”路径下,同时在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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-30
    • 2020-09-19
    • 2011-08-30
    • 2019-04-23
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    相关资源
    最近更新 更多