9

我有一个通用的 ServiceResponse 类,如下所示:

@XMLRootElement
public class ServiceResponse<T>
{
    private T data;
    private String error;
    //setters n getters

}

从我的 RESTEasy 服务,我想生成 xml 响应:

List<Customer> customers = someDAO.getCustomers();
ServiceResponse<List<Customer>> resp = new ServiceResponse<List<Customer>>();
resp.setData(customers);
resp.setError("No Error");
return resp;
or return Response.ok().entity(resp).build();

但这会引发错误,因为 java.util.List 没有 JaxbMarshallWriter。

我可以编组列表使用 GenericEntity 类。

GenericEntity<List<Customer>> entity = new GenericEntity<List<Customer>>(customers){};
Response.ok(entity).build();

但是GenericEntity<ServiceResponse<List<Customer>>>没有为 java.util.List 说没有 JaxbMarshallWriter。

是否可以使用通用模板(,)来编组/解组类?

4

4 回答 4

1

我不确定您的类使用通用模板是否会有所不同,但这就是我使用 RESTEasy 生成 XML 响应的方式

这是将保存您的服务响应的类

public class ServiceResponse<T>
{
    private T data;
    private String error;
    //setters n getters
}

这个类实际上会将您的响应转换为 XML。除了接收和生成 XML/JSON 或您正在使用的任何内容之外,这个类实际上并没有做太多事情。然后它将请求传递给执行实际工作的类。然而,这门课可以回答你的具体问题(我相信)。

@Path("/myrestservice")
public class SomeRestService
{
    private SomeCoreService coreService;
    //getters and setters here

    @POST
    @Path("/examples/")
    @Consumes({MediaType.APPLICATION_XML}) //this consumes XML
    @Produces({MediaType.APPLICATION_XML}) //this produces XML
    public ServiceResponse<T> exampleFunction(Request request)
    {
        try
        {
            //Unwrap the request and take only what you need out
            //of the request object here
            return this.coreService.examples(request.getStringFromRequest());
        }
        catch(Exception ex)
        {
            return new ServiceResponse<T>(Put response error message here);
        }
    }
}

这是完成所有实际工作的类。

public class SomeCoreService
{
    public ServiceResponse<T> examples(String stringFromRequest)
    {
        //do whatever work you need to do here.
        return new ServiceResponse<T>(put whatever you need in the service response here)
    }
}

另外,我还没有测试过这些。希望这足以让您获得模式。

于 2013-03-08T17:34:34.133 回答
0

问题不是通用的问题是您应该将列表包装在一个对象中。

ServiceResponse<ResponseData<Customer>> resp = new ServiceResponse<ResponseData<Customer>>();

然后,您可以注释 ResponseData 类以表示一组对象。

于 2012-12-02T11:03:23.140 回答
0

我为同样的问题所做的一个解决方案是创建一个新类型来模拟泛型类型 List,正如我所做的那样,我创建了一个名为 Container 的新类型(例如:PersonContainer),其中有一个我的实体(人)的列表,我使用它而不是 List 类型,它工作得很好......

这里有我的例子,如果它对你有用的话:

package com.dosideals.server.beans;

import java.io.Serializable;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.xml.bind.annotation.XmlRootElement;

/**
 *
 * @author LOTFI
 */
@Entity
@XmlRootElement
public class Admin implements Serializable {

    @Id
    private String login;
    private String password;
    private String firstName;
    private String lastName;

    public Admin() {
    }

    public Admin(String login, String password, String firstName, String lastName) {
        this.login = login;
        this.password = password;
        this.firstName = firstName;
        this.lastName = lastName;
    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    @Override
    public boolean equals(Object obj) {
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final Admin other = (Admin) obj;
        if ((this.login == null) ? (other.login != null) : !this.login.equals(other.login)) {
            return false;
        }
        return true;
    }

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 83 * hash + (this.login != null ? this.login.hashCode() : 0);
        return hash;
    }

    @Override
    public String toString() {
        return "Admin{" + "login=" + login + ", password=" + password + ", firstName=" + firstName + ", lastName=" + lastName + '}';
    }
}

这是容器 AdminContainer :

package com.dosideals.server.beans.containers;

import com.dosideals.server.beans.Admin;
import java.util.List;
import javax.xml.bind.annotation.XmlRootElement;

/**
 *
 * @author LOTFI
 */
@XmlRootElement
public class AdminContainer {

    private List<Admin> admin;

    public AdminContainer() {
    }

    public AdminContainer(List<Admin> admin) {
        this.admin = admin;
    }

    public List<Admin> getAdmin() {
        return admin;
    }

    public void setAdmin(List<Admin> admin) {
        this.admin = admin;
    }
}
于 2013-02-12T15:28:19.737 回答
0

我知道回复晚了,但由于没有投票的答案,我会尽力给出我的答案,希望它有所帮助。

问题是当你有一个泛型类说 MyClass jaxB excepts T 用@XMLRootElement 或@XMLType 进行注释时。

在您的代码场景中,您的类型 T 属于 List List 没有任何 @XMLRootElement 或 @XMLType 因此它会引发错误。我认为上述情况的解决方案是为 Collection 创建一个包装类,例如

@XMLRootElement
Class JaxBCollection<T>{
    java.util.Collection<T> collection;
    /* Have getters and setters*/
}

现在在你的代码中有这样的东西。

List<Customer> customers = someDAO.getCustomers();
JaxBCollection<Customer> jaxBCustomers= new JaxBCollection<Customer>();
jaxBCustomers.setCollection(customers);
ServiceResponse<JaxBCollection<Customer>> resp = new ServiceResponse<JaxBCollection<Customer>>();
resp.setData(jaxBCustomers);
resp.setError("No Error");
return resp;
于 2013-04-20T13:19:44.407 回答