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
진정 날로 먹으려는 심보란
대상에게 관심을 주지 않고 얻어내려는 심보이다. 관심을 주는 것이 가장 비싼 자원이다. 물리적으로 같은 공간을 나눴다거나, 많은 시간을 투자했다거나, 돈을 많이 투자했다거나, 그전에 공부를 얼마나 많이 했고,
아침에 힘들지 않게 일어나기 위한 간단한 방법
자기전에 생수를 2컵 정도 마신다. 생리현상 때문에 늦잠자는 일이 없어진다. 물론 완전 피곤한 상태에서 사용하면 중간에 화장실만 다녀오게 되고 다시 바로 잠들 수 있으니 주의. 게다가 피부가 탄력을 찾는 이점이
iBATIS 접견
나는 언제까지 원시인 코딩을 계속 할 것인가. 나는 왜 아직도 extends HttpServlet 을 하여 웹프로그램을 만드는가. 나는 왜 아직도 vim 과 editplus 뿐인가. spring,