2012-05-25 49 views
9

我有一個通用的ServiceResponse類,如下所示:如何使用RESTEasy中的通用模板類(<T>)生成XML響應?

@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沒有JaxbMarshallWriter .util.List。

我可以列表列舉usinig GenericEntity類。

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

GenericEntity<ServiceResponse<List<Customer>>>工作不說不JaxbMarshallWriter爲java.util.List的。

是否有任何解決通用模板(,)的marshall/unmarshall類?

+0

也許這有幫助嗎? http://stackoverflow.com/questions/5391486/make-a-collection-generic-in-javax-xml-bind – Friso

回答

0

問題不是通用問題是你應該將你的列表包裹在一個對象中。

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

然後,您可以註釋ResponseData類來表示一組對象。

0

我爲同樣的問題所做的一個解決方案是創建一個新類型來模擬泛型類型List,就像我所做的那樣,我創建了一個名爲Container的新類型(例如:PersonContainer)其中有我的實體(人),我使用了列表式的,而不是一個列表,它工作得很好......

這裏有我的例子,如果它能夠對您有用:

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; 
    } 
} 
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) 
    } 
} 

另外,我還沒有測試過這些。希望你能夠得到這個模式就足夠了。

0

我知道很遲纔回復,但由於沒有投票答案,我會盡量給我的答案,希望它有幫助。

問題是當你有一個泛型類說,MyClass jaxB除了T用@XMLRootElement或@XMLType註釋。

在您的代碼場景中,您的類型T是List List,沒有任何@XMLRootElement或@XMLType,因此會引發錯誤。 我覺得對於上述情況的解決方案是創建一個集合的包裝類像

@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; 
相關問題