개발_웹/Java

Java | 객체(Object) ↔ XML (spring oxm, jaxb를 이용한 xml 변환)

zuyo 2017. 10. 31. 15:53
반응형
Spring oxm과 JAXB를 이용한 객체  XML 변환
 
1. porm.xml (Maven dependency 추가)
1) spring oxm 
- 'spring xml' 검색
- 'Spring Object/XML Marshalling' 선택
- 4.3.4 버전
 
2) jaxb
- jaxb 검색
- Java Architecture For XML Binding » 2.2.12
 
2. dispatcherServlet
- xml 파일의 Namespace 탭에서 p와 oxm 체크 (STS 플러그인 설치해야 보임)
- (근데 회사 eclipse Luna 버전에서 Namespaces 탭이 안보이는 것 같은데? (STS는 설치되어있음))
- (STS 버전이 잘못된건가해서 Luna용 STS를 깔려고 했는데 안깔아짐)
- (그래서 Luna말고 다른 버전을 쓰니까 STS 깔리고 Namespaces 탭도 보인다)
<constructor-arg>
<bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller"
p:classesToBeBound="domain.Users"/>
</constructor-arg>

 

3. @XmlRootElement

- xml element로 사용할 객체에 @XmlRootElement 어노테이션 등록

 


예)

 

컨트롤러

@Controller public class UsersXmlController {  	/** 	 * 원래 String, ModelandView가 리턴타입인데 Users로 하려면 다음처럼 responsebody 	 * 실행 시 URL 뒤에 /userlist.do 를 붙여줘서 실행하면 xml이 출력된다. 	 */ 	@RequestMapping(value="/userlist.do", produces="application/xml") 	public @ResponseBody Users getUsersToXml() { 		 		/*----------------------------------------------------------------------------------------------------- 		 * 서비스, 스토어 없이 여기서 생성하겠다. 		 * --------------------------------------------------------------------------------------------------*/  		 		List<User> list = new ArrayList<>(); 		Users users = new Users(); 		 		User u1 = new User(); 		u1.setNo(1); 		u1.setId("abc"); 		u1.setPw("123"); 		u1.setName("강대봉"); 		u1.setAddress("서울시"); 	 		User u2 = new User(); 		u2.setNo(1); 		u2.setId("adfgbc"); 		u2.setPw("1234"); 		u2.setName("홍구"); 		u2.setAddress("서울시"); 		 		list.add(u1); 		list.add(u2); 		 		users.setUsers(list); 		 		return users; 	} } 
도메인A
- @XmlRootElement로 user객체를 xml의 <user>요소로 변환
/**  * xml에서 <user>로 묶임  *   */ @XmlRootElement(name="user") @XmlAccessorType(XmlAccessType.FIELD) @Component public class User { 	 	private int no; 	private String id; 	private String pw; 	private String name; 	private String address; 	(이하 생략..)

도메인B (도메인A의 List)

- @XmlRootElement로 users객체를 xml의 <users>요소로 변환

/**  * xml에서 <users>로 묶임  *  */ @XmlRootElement(name="users") @XmlAccessorType(XmlAccessType.FIELD) @Component public class Users {  	@XmlElement(name="user") 	private List<User> users;  	public List<User> getUsers() { 		return users; 	}  	public void setUsers(List<User> users) { 		this.users = users; 	} } 
디스패처 서블릿
- jaxb의 xml뷰어 클래스 등록
- Namespaces 탭에서 p, oxm에 체크 (STS 플러그인 설치해야 보임)
(...생략)
<mvc:annotation-driven></mvc:annotation-driven> 		 		<!-- 빈 등록 (어노테이션을 이용한 등록 - component-scan 방식) --> 		<context:component-scan base-package="controller"></context:component-scan> 		<context:component-scan base-package="domain"></context:component-scan> 		 		<!-- 빈 등록 (생성자 이용) : JAXB를 이용한 마샬링 --> 		<bean id="xmlViewer" class="org.springframework.web.servlet.view.xml.MarshallingView"> 		 			<!-- 아래 코드는 Namespaces 탭에서 p, oxm에 체크해야 함! --> 			<constructor-arg> 				<bean class="org.springframework.oxm.jaxb.Jaxb2Marshaller" 					p:classesToBeBound="domain.Users"/> 			</constructor-arg> 		</bean>
(...생략)

porm.xml

- spring-oxm

- jaxb-api

(...생략) 		<!-- https://mvnrepository.com/artifact/org.springframework/spring-oxm --> 		<dependency> 			<groupId>org.springframework</groupId> 			<artifactId>spring-oxm</artifactId> 			<version>4.3.4.RELEASE</version> 		</dependency> 		 		<!-- https://mvnrepository.com/artifact/javax.xml.bind/jaxb-api --> 		<dependency> 			<groupId>javax.xml.bind</groupId> 			<artifactId>jaxb-api</artifactId> 			<version>2.2.12</version> 		</dependency> (...생략)

run on server로 실행 

- URL 주목.. @RequestMapping에서 설정한 컨트롤러 메소드(xml로 변환될 객체를 리턴하는 메소드)로 접속

 

 

반응형