2012-05-25 6 views
9

나는 일반적인 ServiceResponse 클래스가RESTEasy에서 일반 템플릿 (<T>)을 사용하여 클래스에서 XML 응답을 생성하는 방법은 무엇입니까?</p> 내 RESTEasy가 서비스에서 <pre><code>@XMLRootElement public class ServiceResponse<T> { private T data; private String error; //setters n getters } </code></pre> <p>, 난 같은 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(); 

을하지만이 자바에 대한 JaxbMarshallWriter 없기 때문에 오류를 던지고있다 .util.List.

사용자 정의 GenericEntity 클래스를 marshalling 할 수 있습니다.

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

그러나 GenericEntity<ServiceResponse<List<Customer>>>는 java.util.List에 대한 JaxbMarshallWriter 말을하지 작동하지 않습니다.

일반 템플릿 (,)을 사용하여 클래스를 마샬링/언 마샬링 할 수있는 방법이 있습니까?

+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 컨테이너입니다.

이 클래스는 일반적인 템플릿을 사용하는 차이를 만드는 경우3210
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 목록의 목록 목록에 @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; 
관련 문제