次のように、RestTemplate を使用して Web サービスからオブジェクトをロードしようとしています。
Menu menu = null;
RestTemplate rest = new RestTemplate();
String request = "<?xml version=\"1.0\" ?><MenuSync><Header><VendorName>usablehealth</VendorName></Header></MenuSync>";
menu = rest.postForObject("http://localhost:6788/LRequest.cgi", request, Menu.class);
これにより例外が生成されます。
[com.sun.org.apache.xerces.internal.impl.io.MalformedByteSequenceException: 3 バイト UTF-8 シーケンスのバイト 2 が無効です。] com.google.gwt.user.server.rpc.RPC.encodeResponseForFailure(RPC) で.java:389) com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:579) で com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:208) ) com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248) で com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62) で javax. servlet.http.HttpServlet.service(HttpServlet.java:637) at javax.servlet.http.HttpServlet.service(HttpServlet.java:717) at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487) org.mortbay.jetty.servlet にあります。org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216) の ServletHandler.handle(ServletHandler.java:362) org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181) の org .mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:729) で org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405) で org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper) .java:152) org.mortbay.jetty.handler.RequestLogHandler.handle(RequestLogHandler.java:49) で org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152) で org.mortbay.jetty. org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:505) の Server.handle(Server.java:324) org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:843) org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:647) で org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211) で org.mortbay.jetty.HttpConnection.handle(HttpConnection.java) :380) org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:395) で org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:488) で
簡単そうに見えますが、Web サービスから読み込まれた XML には UTF-8 違反は含まれていません。明示的な JAXB を使用してオブジェクトを非整列化すると、正常に動作します。
Menu menu = null;
RestTemplate rest = new RestTemplate();
String request = "<?xml version=\"1.0\" ?><MenuSync><Header><VendorName>usablehealth</VendorName></Header></MenuSync>";
String response = rest.postForObject("http://localhost:6788/LRequest.cgi", request, String.class);
try {
JAXBContext context = JAXBContext.newInstance(Menu.class);
Unmarshaller um = context.createUnmarshaller();
um.setEventHandler(new CustomValidationEventHandler());
menu = (Menu) um.unmarshal(new ByteArrayInputStream(response.getBytes("UTF-8")));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (JAXBException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
マーシャル/アンマーシャル実装がデフォルト (JAXB?) である必要があるため、applicationContext で RestTemplate Bean を宣言していません。これらのソリューションの違いは何ですか?