ContentNegotiatingViewResolver를 이용한 XML, JSON 뷰 만들기

2013. 4. 16. 13:48·프레임워크/[Java] spring

ContentNegotiatingViewResolver를 이용하면 xml, json 뷰를 편하게 만들 수 있다. 

서블릿 컨텍스트에 ContentNegotiatingViewResolver와 json뷰, xml 뷰 설정을 처리하도록 한다. 


json 뷰는 MappingJacksonJsonView를 이용하고, xml 뷰는 Jaxb2Marshaller를 이용하도록 한다. 

* 이 두가지 뷰외에도 다양한 뷰가 있다. 다른 뷰를 활용하는 방법도 찾아보면 좋을 것 같다. 


servlet-context.xml 은 다음과 같이 설정한다. 

	



	
	
	
	

	
	

	
	
		
		
	
	
	
	
	
	
		
		
			
				
				
			
		

		
		
		
			
				
					
				
				
                    
                    
                
			
		
	
	
	
	
        
            
                sdk.spring.xml.model.XmlData
            
        
    

그러면 일단 설정은 완료 되었다. 

* Jaxb2Marshaller는 마샬링을 처리하려고 하는 Java 클래스를 꼭 지정해 주어야 한다. 그러지 않으면 오류가 발생 한다.


컨트롤러의 구현은 다음과 같다. 


 
package sdk.spring.xml;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

import sdk.spring.xml.model.XmlChildData;
import sdk.spring.xml.model.XmlData;

/**
 * Handles requests for the application home page.
 */
@Controller
public class ViewController {
	
	/**
	 * Json 데이터는 다음과 같이 Map 에 넣으면 출력된다. 
	 * 
	 * @param model
	 */
	@RequestMapping(value = "/jsondata", method = RequestMethod.GET)
	public void jsondata(Model model) {
		
		List> list = new ArrayList>();
		Map data1 = new HashMap();
		data1.put("name", "a");
		
		Map data2 = new HashMap();
		data2.put("name", "b");
		
		list.add(data1);
		list.add(data2);
		
		model.addAttribute("data", list);
	}
	
	/**
	 * Jaxb2Marshaller 는 마샬링을 위한 클래스가 필요하므로 
	 * 다음과 클래스를 선언해주어야 한다. 
	 * 
	 * @param model
	 */
	@RequestMapping(value = "/xmldata", method = RequestMethod.GET)
	public void xmldata(Model model) {
		
		List list = new ArrayList();
		
		XmlChildData child1 = new XmlChildData();
		child1.setEmail("1");
		child1.setName("a");
		child1.setPosition("z");
		
		XmlChildData child2 = new XmlChildData();
		child2.setEmail("2");
		child2.setName("b");
		child2.setPosition("x");
		
		list.add(child1);
		list.add(child2);
		
		XmlData data = new XmlData();
		data.setItems(list);
		
		model.addAttribute("data", data);
	}
}

컨트롤러는 위와 같이 등록하면된다. 

마샬링을 위한 Java 데이터 객체는 다음과 같이 등록한다. 


package sdk.spring.xml.model;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;

@XmlAccessorType(XmlAccessType.FIELD)
public class XmlChildData {

	@XmlElement(name = "email")
	private String email;

	@XmlElement(name = "name")
	private String name;

	@XmlElement(name = "position")
	private String position;

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public String getPosition() {
		return position;
	}

	public void setPosition(String position) {
		this.position = position;
	}
}
package sdk.spring.xml.model;

import java.util.List;

import javax.xml.bind.annotation.XmlAccessType;
import javax.xml.bind.annotation.XmlAccessorType;
import javax.xml.bind.annotation.XmlElement;
import javax.xml.bind.annotation.XmlRootElement;

@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "root")
public class XmlData {

	@XmlElement(name = "items")
	private List items;

	public List getItems() {
		return items;
	}

	public void setItems(List items) {
		this.items = items;
	}
}


결과값은 다음과 같이 볼수 있다. 

http://localhost:1180/xml/xmldata.json

{"data":{"items":[{"email":"1","name":"a","position":"z"},{"email":"2","name":"b","position":"x"}]}}


http://localhost:1180/xml/xmldata.xml


<root>
<items>
<email>1</email>
<name>a</name>
<position>z</position>
</items>
<items>
<email>2</email>
<name>b</name>
<position>x</position>
</items>
</root>

와 같은 결과를 얻을 수 있다. 

물론 jsondata.json 으로 접근해도 동일한 결과를 얻을 수 있지만 jsondata.xml 으로는 결과를 얻을 수 없다. 
Map 은 마샬링 객체로 등록이 되어 있지 않기 때문이다. 



* Java 코드 끝에 XML 데이터가 들어 가있는것은... syntaxhighlighter의 오류인 것같다... 없애도 다시 생긴다.

GitHub 링크


반응형

'프레임워크 > [Java] spring' 카테고리의 다른 글

AOP로 로그 남기기  (0) 2013.04.11
'프레임워크/[Java] spring' 카테고리의 다른 글
  • AOP로 로그 남기기
hs_seo
hs_seo
Hello World!
    반응형
  • hs_seo
    개발자로 살아남기
    hs_seo
  • 전체
    오늘
    어제
    • 전체 (1140)
      • 개발자 (21)
        • 개발에 유의할 점 (0)
        • 면접 (5)
      • IT 소식 (5)
        • 업계 (1)
      • java (51)
        • 디자인패턴 (3)
        • apache-common (1)
      • 개념 (47)
        • 자료구조 (4)
        • 함수형사고 (8)
        • 디자인패턴 (1)
      • 데이터분석 (1)
      • python (67)
        • 코드조각 (12)
        • 라이브러리 (2)
      • 빅데이터 (418)
        • zookeeper (5)
        • hadoop (78)
        • hdfs (12)
        • hive (127)
        • hbase (16)
        • spark (40)
        • scala (4)
        • trino (3)
        • oozie (41)
        • Hue (9)
        • R (5)
        • sqoop (6)
        • flume (3)
        • elasticsearch (2)
        • airflow (16)
        • kafka (3)
        • kubernetes (10)
        • openstack (3)
        • flink (2)
        • redis (2)
      • 빅데이터 강좌 (2)
      • 알고리즘 (131)
        • 알고리즘 (1)
        • 백준 (61)
        • 정올 (41)
        • 더블릿 (5)
        • 프로그래머스 (1)
      • 프로그래밍 언어 (30)
        • go (4)
        • js (9)
        • .Net (6)
        • Jsp (1)
        • ansible (3)
        • terraform (6)
      • Tools (56)
        • docker (2)
        • macbook (6)
        • maven (3)
        • sublime (1)
      • 프레임워크 (25)
        • [JS] angularjs (2)
        • [JS] node.js (19)
        • [Java] spring (2)
        • Android (2)
      • 데이타베이스 (43)
        • SQLD (5)
        • Oracle (1)
        • MySQL (8)
        • ADsP (2)
      • 리눅스 (25)
        • Bash (61)
      • GCP (5)
      • AWS (34)
        • EC2 (2)
        • EMR (14)
      • 정보보안기사 (4)
        • 네트워크 (1)
      • 개인 (80)
        • 업무실수 (0)
        • 책 (9)
        • 교육 (3)
        • 여행 (17)
        • 영화 (12)
        • 음악 (2)
        • 피규어 (4)
        • 게임 (3)
        • 생각 (7)
        • 기타 (10)
        • 좋은글 (5)
        • 좋은 사이트 (2)
  • 블로그 메뉴

    • 홈
    • 태그
    • 미디어로그
    • 위치로그
    • 방명록
  • 링크

    • 빅데이터-하둡,하이브로 시작하기
    • 빅데이터-스칼라, 스파크로 시작하기
    • Kaggle에서 파이썬으로 데이터 분석 시작하기
    • 쉘스크립트 개발 시작하기
    • 개발자가 데이터 분석 준전문가 되기
    • 데브쿠마
  • 공지사항

  • 인기 글

  • 태그

    error
    oozie
    yarn
    hbase
    오류
    HIVE
    nodejs
    하이브
    k8s
    다이나믹
    하둡
    build
    Python
    mysql
    백준
    HDFS
    java
    Tez
    Hadoop
    Linux
    airflow
    ubuntu
    정올
    emr
    알고리즘
    SPARK
    파이썬
    bash
    S3
    AWS
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.6
hs_seo
ContentNegotiatingViewResolver를 이용한 XML, JSON 뷰 만들기
상단으로

티스토리툴바