그 중의 하나인 XmlJavaTypeAdapter를 살펴보기로 한다.
아래의 소스코드를 살펴 보자
package sample.maven.jaxws;
import java.sql.Timestamp;
import javax.xml.bind.annotation.XmlType;
@XmlType
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;
}
public Timestamp getCreateDate() {
return createDate;
}
public void setCreateDate(Timestamp createDate) {
this.createDate = createDate;
}
}
대부분의 dateTime 처리와 관련하여 java.util.Date 타입을 처리하면 문제가 될 게 없다.
Jaxb에서도 java.util.Date 처리를 기본적으로 지원하고 있다.
하지만 Anyframe의 QueryService는 java.util.Date로 매핑을 하게 되면 시분초를 싸그리 없애버린다.
java.sql.Date도 아닌데 말이다.
어쨋거나 어쩔 수 없이 또는 이런 저런 이유로 Timestamp를 데이터 타입으로 사용해야 하는 경우가 있다.
디폴트 생성자도 없는 Timestamp를 Jaxb는 기본적으로 처리할 수가 없다.
따라서 Jaxb가 Timestamp를 java.util.Date로 처리할 수 있도록 어뎁터(Adapter)를 구현해 주어야 한다.
Adapter를 지정하지 않은 경우에 CXF가 웹서비스를 초기화하는 과정에서 아래와 같은 에러메시지가 출력된다.
Timestamp를 사용하는 bean
package sample.maven.jaxws;
import java.sql.Timestamp;
import javax.xml.bind.annotation.XmlType;
@XmlType
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;
}
public Timestamp getCreateDate() {
return createDate;
}
public void setCreateDate(Timestamp createDate) {
this.createDate = createDate;
}
}
에러 메시지
... 39 more
Caused by: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
java.sql.Timestamp does not have a no-arg default constructor.
this problem is related to the following location:
at java.sql.Timestamp
at public java.sql.Timestamp sample.maven.jaxws.User.getCreateDate()
at sample.maven.jaxws.User
at private sample.maven.jaxws.User sample.maven.jaxws.jaxws_asm.GetUserResponse._return
at sample.maven.jaxws.jaxws_asm.GetUserResponse
Caused by: com.sun.xml.bind.v2.runtime.IllegalAnnotationsException: 1 counts of IllegalAnnotationExceptions
java.sql.Timestamp does not have a no-arg default constructor.
this problem is related to the following location:
at java.sql.Timestamp
at public java.sql.Timestamp sample.maven.jaxws.User.getCreateDate()
at sample.maven.jaxws.User
at private sample.maven.jaxws.User sample.maven.jaxws.jaxws_asm.GetUserResponse._return
at sample.maven.jaxws.jaxws_asm.GetUserResponse
XmlAdapter
package sample.maven.jaxws; import java.sql.Timestamp; import java.util.Date; import javax.xml.bind.annotation.adapters.XmlAdapter; public class DateTimestampAdapter extends XmlAdapter{ @Override public Timestamp unmarshal(Date v) throws Exception { return new Timestamp(v.getTime()); } @Override public Date marshal(Timestamp v) throws Exception { return new Date(v.getTime()); } }
@XmlJavaTypeAdapter를 적용한 User 빈
package sample.maven.jaxws;
import java.sql.Timestamp;
import javax.xml.bind.annotation.XmlType;
import javax.xml.bind.annotation.adapters.XmlJavaTypeAdapter;
@XmlType
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;
}
}
댓글 없음:
댓글 쓰기