- Mapping of MIME Types
- 日常茶飯事
- 2010. 7. 14. 16:01
MimeBodyPart.getContent() 의 리턴되는 객체가 String이였는데 JEUS 6에서는 에러가 발생한다.
소스가 (String)MimeBodyPart.getContent() 이렇게 되어 있다.
확인 결과 JEUS의 라이브러리인 javaee.jar에서 발생하였고 기술지원을 받음.
getContent()는 MIME 타입에 따라 다른 객체를 리턴한다고 한다.
Tmax의 답변
MIME 타입이 xml 이므로 거기에 해당하는 객체가 리턴되고 적절한 처리를 하면 된다.
java.lang.ClassCastException:
javax.xml.transform.stream.StreamSource incompatible with
java.lang.String
소스가 (String)MimeBodyPart.getContent() 이렇게 되어 있다.
확인 결과 JEUS의 라이브러리인 javaee.jar에서 발생하였고 기술지원을 받음.
getContent()는 MIME 타입에 따라 다른 객체를 리턴한다고 한다.
Tmax의 답변
기존 J2EE 1.4에서는 엄격하게
적용하지 않았지만, JavaEE 5 부터
JAX-WS 가 도입되면서 부터는
매핑을 엄격하게 적용하여 구현하고 있습니다.
매핑을 엄격하게 적용하여 구현하고 있습니다.
MIME Type | Java Type |
image/gif | java.awt.Image |
image/jpeg |
java.awt.Image |
text/plain |
java.lang.String |
multipart/* |
javax.mail.internet.MimeMultipart |
text/xml or application/xml |
javax.xml.transform.Source |
MIME 타입이 xml 이므로 거기에 해당하는 객체가 리턴되고 적절한 처리를 하면 된다.
public String toString(Object obj) throws IOException{ if(obj instanceof String){ return (String)obj; }else if(obj instanceof StreamSource){ //JavaEE 5 Spec에 따라 구현 logger.debug("StreamSource"); InputStream in = ((StreamSource)obj).getInputStream(); ByteArrayOutputStream b = new ByteArrayOutputStream(); byte[] buf = new byte[1024]; int read; while((read = in.read(buf)) > 0){ b.write(buf, 0, read); } //b.close(); //할 필요없음. return b.toString(); }else{ throw new RuntimeException("Invalid arg type : " + ((obj == null) ? "null" : obj.getClass().getName())); } }
- 테스트케이스
- MIME 타입에 따른 처리가 되는지 확인하기 위해 javax.activation.debug 시스템 프로퍼티를 true로 하면 자세한 로그 내용을 볼 수 있다.
public class SOAPMessageTest extends TestCase { SOAPMessage soapMessage = new SOAPMessage(); public void testToStringWithString() throws Exception{ String s = "Hi~~"; String actual = soapMessage.toString(s); assertEquals(s, actual); } public void testToStringWithNull() throws Exception{ try{ soapMessage.toString(null); fail("null은 처리할 수 없음."); }catch(RuntimeException e){ assertEquals("null인 경우", "Invalid arg type : null", e.getMessage()); } } public void testToStringWithOtherObject() throws Exception{ try{ soapMessage.toString(BigDecimal.ZERO); fail("처리할 수 없는 객체"); }catch(RuntimeException e){ assertEquals("지원하지 않는 경우", "Invalid arg type : java.math.BigDecimal", e.getMessage()); } } public void testToStringWithStream() throws Exception{ String thisFilePath = "test/" + this.getClass().getName().replace(".", "/") + ".java"; InputStream inputStream = new FileInputStream(new File(thisFilePath)); StreamSource streamSource = new StreamSource(inputStream); String actual = soapMessage.toString(streamSource); assertEquals(readFile(new File(thisFilePath)), actual); } private String readFile(File file) throws IOException{ InputStream in = new FileInputStream(file); byte[] buf = new byte[1024]; int read; StringBuffer tmp = new StringBuffer(); while((read = in.read(buf)) > 0){ tmp.append(new String(buf, 0, read)); } return tmp.toString(); } }
- MIME 타입에 따른 처리가 되는지 확인하기 위해 javax.activation.debug 시스템 프로퍼티를 true로 하면 자세한 로그 내용을 볼 수 있다.
Recent comment