2010년 8월 30일 월요일

Spring에서 Jaxb (Un)Marshaller 사용하기

스프링에서 XOM(Xml-Object Mapping)을 사용하는 방법이다.
이미 WebService를 사용하기 위해서 JAXB 애너테이션을 사용하고 있는 경우라면
더욱 사용하기가 용이하다.

다음은 User 객체를 XML로 마샬링하는 방법과 XML을 User객체로 언마샬링하는 방법을 보여주는 간단한 예제다.

/spring/context-oxm.xml 예제
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:oxm="http://www.springframework.org/schema/oxm"
    xsi:schemaLocation="
     http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
     http://www.springframework.org/schema/oxm 
     http://www.springframework.org/schema/oxm/spring-oxm-1.5.xsd">

 <bean id="jaxb2Marshaller" class="org.springframework.oxm.jaxb.Jaxb2Marshaller">
  <property name="classesToBeBound">
   <list>
    <value>sample.maven.jaxws.User</value>
   </list>
  </property>
 </bean>
 
</beans>    

아래의 소스는 사용자 정보를 담고 있는 Jaxb 클래스다.
CXF에서 XmlType 애너테이션만 설정하면 WSDL이 생성되는 것과는 달리
Jaxb2Marshaller에서는 XmlRootElement 애너테이션을 반드시 설정해 주어야 한다.

User 클래스
package sample.maven.jaxws;

import java.sql.Timestamp;

import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;

@XmlType
@XmlRootElement(name="user", namespace="org.sds.sample")
public class User {
 private long userId;
 private String loginId;
 private String userName;
 private Timestamp createDate;
 public long getUserId() {
  return userId;
 }
 public void setUserId(long userId) {
  this.userId = userId;
 }
 public String getLoginId() {
  return loginId;
 } 
 public void setLoginId(String loginId) {
  this.loginId = loginId;
 }
 public String getUserName() {
  return userName;
 }
 public void setUserName(String userName) {
  this.userName = userName;
 }
 @XmlJavaTypeAdapter(value=DateTimestampAdapter.class)
 public Timestamp getCreateDate() {
  return createDate;
 }
 public void setCreateDate(Timestamp createDate) {
  this.createDate = createDate;
 }
 @Override
 public String toString() {
  return "User [userId=" + userId + ", loginId=" + loginId
    + ", userName=" + userName + ", createDate=" + createDate + "]";
 }
 
 
}


아래는 JUnit테이스 케이스다.
User객체를 XML로 마샬링하는 예제와 XML을 User객체로 언마샬링하는 예제가 포함되어 있다.

Jaxb 테스트 케이스
package sample.maven.jaxws;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.OutputStream;

import javax.annotation.Resource;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.oxm.Marshaller;
import org.springframework.oxm.Unmarshaller;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@ContextConfiguration(locations={"classpath*:/spring/context-*.xml"})
@RunWith(SpringJUnit4ClassRunner.class)

public class UserXomTest {

 @Resource(name="jaxb2Marshaller")
 Marshaller marshaller;
 
 @Resource(name="jaxb2Marshaller")
 Unmarshaller unmarshaller;
 
 @Test
 public void testMarshaller() throws Exception {
  User user = new User();
  user.setLoginId("loginId");
  
  ByteArrayOutputStream out = new ByteArrayOutputStream();
  
  StreamResult result = new StreamResult(out);
  marshaller.marshal(user, result);
  
  System.out.println(out.toString());
  
  ByteArrayInputStream in = 
   new ByteArrayInputStream(out.toByteArray());
  
  StreamSource source = new StreamSource(in);
  User newUser = (User) unmarshaller.unmarshal(source);
  
  System.out.println("new user: " + newUser);
 }
}

댓글 없음:

댓글 쓰기