[SPRING] JAXB를 사용하여 XML에서 List를 반환하는 Spring 4 REST 프로그램
SPRINGJAXB를 사용하여 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.나는 고객 목록의 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.백 엔드 서비스가 반환하는 응답 유형이 제공되지 않았거나 요청의 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; }
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
'SPRING' 카테고리의 다른 글
[SPRING] Maven 프로젝트 용 애플리케이션 설정 파일은 어디에 두어야하나요? (0) | 2019.03.16 |
---|---|
[SPRING] Spring Boot Maven Plugin을 사용할 때 jar 파일에서 Spring Boot 애플리케이션의 자원이 누락된다. (0) | 2019.03.16 |
[SPRING] Hibernate가 다른 데이터 소스를 읽거나 쓰도록 설정하는 방법은 무엇입니까? (0) | 2019.03.16 |
[SPRING] 어노테이션 된 메소드 인수를 사용하여 JSR 303 Bean 유효성 검증을 사용 가능하게하는 표준 방법이 있습니까? (0) | 2019.03.16 |
[SPRING] 풀 오류가 발생합니다. 유휴 상태의 객체를 기다리는 시간 초과입니다. (0) | 2019.03.16 |