1시간 전 J2SE 6으로 올리면서 이것저것 주르륵 업데이트 하고 다 잘 돌아가는지 이것저것 눌러보았고 왠만큼 다 돌아가는 것처럼 보였다.
RenderingHints 문제는 지금도 전혀 납득할 수 없다. 구글 리서치는 잠시 미룬다. 아무튼 정상인줄 알고 헤벌레 하다가 /rss.xml을 눌러보니까 황당한 에러 발생!
<font style="font-size: 11px; font-family: 돋움">
javax.xml.transform.TransformerException: java.lang.UnsupportedOperationException
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:718)
at com.sun.org.apache.xalan.internal.xsltc.trax.TransformerImpl.transform(TransformerImpl.java:313)
at rath.web.service.RDFSiteSummary.service(RDFSiteSummary.java:196)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:92)
at com.caucho.server.dispatch.ServletFilterChain.doFilter(ServletFilterChain.java:106)
at com.caucho.server.webapp.WebAppFilterChain.doFilter(WebAppFilterChain.java:173)
at com.caucho.server.dispatch.ServletInvocation.service(ServletInvocation.java:229)
at com.caucho.server.hmux.HmuxRequest.handleRequest(HmuxRequest.java:420)
at com.caucho.server.port.TcpConnection.run(TcpConnection.java:511)
at com.caucho.util.ThreadPool.runTasks(ThreadPool.java:520)
at com.caucho.util.ThreadPool.run(ThreadPool.java:442)
at java.lang.Thread.run(Thread.java:619)
Caused by: java.lang.UnsupportedOperationException
at com.caucho.xml.QDocument.getXmlVersion(QDocument.java:848)
at com.sun.org.apache.xalan.internal.xsltc.trax.DOM2TO.setDocumentInfo(DOM2TO.java:375)</font>
뭐야 뭔데 -_-? 대략난감이다. jdk 하나 바꿨을 뿐인데.. Transformer.transform 에서 에러가 나다니 이 무슨 날벼락 콤보란 말인가.
욱 하는 마음에 데스크탑 윈2003에서 같은 코드를 돌려보았더니 잘 돌아간다. jdk 6은 죄가 없다. 실제로 com.caucho.xml.QDocument.getXmlVersion의 1줄 구현을 아래처럼 해놓은 caucho가 죄!
throw new UnsupportedOperationException();
스택트레이스 내용을 보면 jdk 6에 포함된 xalan이 문득 caucho 쪽으로 튄다. jdk 5에서는 간단한 transform 수행 시 Document.getXmlVersion(DOM Level 3)가 없어도 괜찮았나 보다. 구글님의 도움으로 찾은 J2SE Tech 문서에 의하면 J2SE 1.4 는 DOM Level 2 를 지원하고 J2SE 6부터 DOM Level 3 를 지원한다고 한다.
DOM Level 3를 지원하는건 좋은데 지원하지 못하는 DOM Level 2의 구현물(caucho resin 3.0.x의 그것)들은 어떻게 살라고 그러는건지 모르겠다. 하위호환성을 좀 더 신경써줬으면 좋았을텐데.
아무튼 이것 때문에 RSS를 닫기도 그렇고 -- 이것 때문에 jdk를 다시 5로 내릴 수는 없잖아
속는 셈 치고 Resin 3.1.0 으로 바꿔봤다. resin 빌드 자주해서 아주 외우겠다 외우겠어 --
./configure --prefix=/home/rath/resin --with-apxs=/opt/apache/bin/apxs --enable-jni make; sudo make install rm -rf ~/html/WEB-INF/work <- 오타나면 작살 -_-; ~/resin/bin/httpd.sh start /opt/apache/bin/apachectl restart
결론은.. 빙고~! XML Transform 잘 돌아간다. :)
문제의 근원은 J2SE 6 은 DOM Level 3 구현물이고 Transformer가 Level 3 를 원하는데 provider가 DOM Level 2 였던 것이였다. 덕분에 Resin 3.1 을 깔아볼 수 있었다.
Resin 3.1 은 Servlet 2.5를 지원하고 watchdog이 들어갔다. 그리고 별 관심은 없지만 Quercus님이 PHP6 유니코드 지원을 한댄다. 이런 짓 하다보면 나도 J2EE에 관심이 조금씩 생겨서 좋다.
아무튼 이제!
[rath@ns lib]$ telnet localhost 80 Trying 127.0.0.1... Connected to localhost (127.0.0.1). Escape character is '^]'. GET / HTTP/1.0
HTTP/1.1 200 OK Date: Fri, 19 Jan 2007 19:42:29 GMT Server: Apache/1.3.37 (Unix) Resin/3.1.0 mod_jk/1.2.15
이렇게 댔다 ㅎㅎ
Comments
4 thoughts shared
UnsupportedOperationException? -0- 그런 Exception도 있었나;; 근데 좀 당황스럽네요. 인스턴스화까지 시킬 수 있는데 객체의 특정 메서드 콜을 하면 그냥 에러가 떨어진다는건 ...
java 너무 오래 안한건가? -0-
rath
abstract method 같은 개념은 아니구요 단순히 RuntimeException 상속받은 클래스에요. 만약 Resin 3.0.22 이전의 QDocument 클래스에 getXmlVersion() 가 없었다면 인스턴스화는 잘 되고 getXmlVersion을 호출하는 순간 AbstractMethodError가 발생하겠지만 3.0.22 이전의 구현은
public String getXmlVersion() { throw new UnsupportedOperationException(); }
요렇게 되있었다는 허무한 말이였어요 -ㅇ-;
xhoto
그쪽 바닥은 내바닥이 아니라 -- 패쓰 --/ ㅋㅋㅋ 이틀 수원에서 요양하고 오늘 저녁에 다시 구미로 ㅠ.ㅠ 담주 주말이나, 다담주 주중 쯤 해서 곱창 1미터 콜?
rath
엉 콜이야 ㅋㅋ 새 회사 출근날짜가 2월 5일로 잡혀서 그 전에는 아주 널럴함!
Continue Reading
Discover more thoughts and insights
Google Web Toolkit 2.0 릴리즈
어지간한 소식이 아니면, 제가 만들지 않은 것에 대한 릴리즈 소식을 전하지 않는데요. GWT 2.0 릴리즈 소식은 꼭 전해야겠다는 생각이 들어 이렇게 소식 전합니다. What's New in GWT
운동과 사색
이 글은 별로 짜임새 있는 글이 되지 않을 것이다. 지금 내 머리속은 그다지 짜임새 있지 않기 때문이다. 10월 3~7일 편안하고 즐거웠던 여행이 있기 바로 2일전까지 자전거로 출퇴근했었다. 그리고 여행을
몸으로 하는 디버깅
재활로 보름째 몸을 빡세게 돌리고 있다. 그제는 잠수교에서 뚝섬유원지까지 걸었다. 속도는 항상 6km/h보다 살짝 빠르게 하는데 대퇴근과 둔근에 자극을 살짝 줘서 리듬을 느끼며 걷는다. 뚝섬유원지 근처에 오니