복붙노트

[SPRING] JAXB를 사용하여 XML에서 List를 반환하는 Spring 4 REST 프로그램

SPRING

JAXB를 사용하여 XML에서 List를 반환하는 Spring 4 REST 프로그램

Spring 4를 사용하여 REST 서비스를 구현하려고합니다.

REST 메서드는 XML로 고객 객체의 목록을 반환합니다. 응용 프로그램은 주석으로 구동됩니다.

XML의 경우 JAXB 주석을 사용했습니다. 내 이해에 따라 JAXB 주석을 찾을 때 Spring은 "Jaxb2RootElementHttpMessageConverter"를 즉시 사용할 것입니다.

고객 POJO :

@XmlRootElement(name = "customer")
public class Customer {
private int id;
private String name;
private List favBookList;
@XmlAttribute
public int getId() {
    return id;
}
public void setId(int id) {
    this.id = id;
}
@XmlElement
public String getName() {
    return name;
}
public void setName(String name) {
    this.name = name;
}

@XmlElementWrapper(name = "booklist")
@XmlElement(name="book")
public List getFavBookList() {
    return favBookList;
}
public void setFavBookList(List favBookList) {
    this.favBookList = favBookList;
}
} 

나는 REST 서비스 클래스에 @RestController로 주석을 달았다 (스프링 4에 따라).

XML에서 고객 목록을 반환하는 REST 메서드

@RequestMapping(value="/customer-list.xml",produces="application/xml")
public  List<Customer> getCustomerListInXML(){
    List<Customer> customerList = new ArrayList<Customer>();
    Customer customerObj1 = new Customer();
    customerObj1.setId(1);
    customerObj1.setName("Vijay");
    ArrayList<String> favBookList1 = new ArrayList<String>();
    favBookList1.add("Book1");
    favBookList1.add("Book2");
    customerObj1.setFavBookList(favBookList1);
    customerList.add(customerObj1);
    Customer customerObj2 = new Customer();
    customerObj2.setId(2);
    customerObj2.setName("Rajesh");
    ArrayList<String> favBookList2 = new ArrayList<String>();
    favBookList2.add("Book3");
    favBookList2.add("Book4");
    customerObj2.setFavBookList(favBookList2);
    customerList.add(customerObj2);
    return customerList;
}

내가 URL을 때 예상했던 결과 :

 <customers>
  <customer id="1">
   <booklist>
    <book xsi:type="xs:string">Book1</book>
    <book xsi:type="xs:string">Book2</book>
   </booklist>
   <name>Vijay</name>
  </customer>
  <customer id="2">
   <booklist>
    <book xsi:type="xs:string">Book3</book>
    <book xsi:type="xs:string">Book4</book>
   </booklist>
   <name>Rajesh</name>
  </customer>
 </customers>

내가 얻는 것 :

HTTP 406 : 이 요청으로 식별 된 자원은 요청 "수락"헤더에 따라 수용 할 수없는 특성을 갖는 응답 만 생성 할 수 있습니다.

노트 :

Customer 개체를 XML로 반환하려고하면 예상대로 작동합니다. 그러나 XML에서 Customer 객체 목록을 반환 할 수 없습니다.

응용 프로그램은 Java 7을 사용하여 개발되었으며 Tomcat 7에서 실행됩니다.

이 도움이 필요합니다. 감사.

해결법

  1. ==============================

    1.나는 고객 목록의 XML을 생성 할 수 있었다.

    나는 고객 목록의 XML을 생성 할 수 있었다.

    먼저 일반 래퍼 클래스를 만듭니다.이 배후의 목적은이 제네릭 클래스를 사용하여 모든 클래스의 개체 목록을 전달하는 것입니다.

    일반 래퍼 클래스 :

    @XmlRootElement
    @XmlSeeAlso({Customer.class})
    public class EntityList<T> {
    
     private List<T> listOfEntityObjects;
    
        public EntityList() {
            listOfEntityObjects = new ArrayList<T>();
        }
    
        public EntityList(List<T> listOfEntityObjects) {
            this.listOfEntityObjects = listOfEntityObjects;
        }
    
        @XmlAnyElement
        public List<T> getItems() {
            return listOfEntityObjects;
        }
    

    수정 된 REST 메소드 :

    @RequestMapping(value="/customer-list.xml",produces="application/xml")
    public  EntityList<Customer> getCustomerListInXML(){
        List<Customer> customerList = new ArrayList<Customer>();
        Customer customerObj1 = new Customer();
        customerObj1.setId(1);
        customerObj1.setName("Vijay");
        ArrayList<String> favBookList1 = new ArrayList<String>();
        favBookList1.add("Book1");
        favBookList1.add("Book2");
        customerObj1.setFavBookList(favBookList1);
        customerList.add(customerObj1);
        Customer customerObj2 = new Customer();
        customerObj2.setId(2);
        customerObj2.setName("Rajesh");
        ArrayList<String> favBookList2 = new ArrayList<String>();
        favBookList2.add("Book3");
        favBookList2.add("Book4");
        customerObj2.setFavBookList(favBookList2);
        customerList.add(customerObj2);
        EntityList<Customer> listOfCustomers =   
        new EntityList<Customer>  (customerList);
    
        return listOfCustomers;
    }
    

    XML 응답 :

    <entityList>
     <customer id="1">
      <booklist>
       <book xsi:type="xs:string">Book1</book>
       <book xsi:type="xs:string">Book2</book>
      </booklist>
      <name>Vijay</name>
     </customer>
     <customer id="2">
      <booklist>
       <book xsi:type="xs:string">Book3</book>
       <book xsi:type="xs:string">Book4</book>
      </booklist>
      <name>Rajesh</name>
     </customer>
    </entityList>
    

    노트 :

    생성 된 XML의 루트 요소는 entityList (래퍼 클래스의 이름에서 가져옴)입니다.

    그러나 XML 루트 요소는이 경우 엔티티 이름의 복수형이어야합니다.

    어떤 생각이나 제안?

  2. ==============================

    2.백 엔드 서비스가 반환하는 응답 유형이 제공되지 않았거나 요청의 Accept-Type HTTP 헤더에서 다른 응답 유형에 응답하고 있습니다.

    백 엔드 서비스가 반환하는 응답 유형이 제공되지 않았거나 요청의 Accept-Type HTTP 헤더에서 다른 응답 유형에 응답하고 있습니다.

    서버에서 반환 한 응답 내용 유형을 확인하십시오. 요청에이 콘텐츠 유형을 입력하십시오. HTTP Accept 헤더 값. http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html HTTP 상태 코드

    필자는 List의 매개 변수화 된 유형을 사용해야한다고 생각합니다.

    private List<String> favBookList; 
    public List<String> getFavBookList() {
       return favBookList;
    }
    public void setFavBookList(List<String> favBookList) {
       this.favBookList = favBookList;
    }
    
  3. from https://stackoverflow.com/questions/28293973/spring-4-rest-program-to-return-a-list-in-xml-using-jaxb by cc-by-sa and MIT license