我有同樣的問題將jaxrs1(球衣)遷移到resteasy 3.0.17.final。
從自定義客戶端上傳form/multipart時,客戶端確實發送了內容類型,但沒有字符集,然後resteasy採用「us-ascii」(根據MIME RFC,根據文檔)。有趣的是,如果根本沒有給出內容類型,resteasy會假定爲「text/plain; charset = ISO-8859-1」(遵循http規範,我假設?)。
他們的文件提出這個使用RestEasy的自定義攔截器來解決:
https://docs.jboss.org/resteasy/docs/3.0.2.Final/userguide/html/Multipart.html#multipart_overwrite_content_type
但這種攔截實際上是不推薦使用,併發布使用JAXRS 2.0攔截機制。
長話短說,讓它在獨立執行的方式工作,你創建這個類:
package x.y.z;
import java.io.IOException;
import javax.ws.rs.WebApplicationException;
import javax.ws.rs.ext.Provider;
import javax.ws.rs.ext.ReaderInterceptor;
import javax.ws.rs.ext.ReaderInterceptorContext;
@Provider
/**
* If charset not given (form multipart upload), default to UTF-8 and not us-ascii (MIME RFC).
*/
public class RestEasyDefaultCharsetInterceptor implements ReaderInterceptor {
// Using string value instead of constant to limit references to RestEasy (this should be possible to set through web.xml imo)
// private static final String RESTEASY_DEFAULT_CHARSET_PROPERTY = org.jboss.resteasy.plugins.providers.multipart.InputPart.DEFAULT_CHARSET_PROPERTY;
private static final String RESTEASY_DEFAULT_CHARSET_PROPERTY = "resteasy.provider.multipart.inputpart.defaultCharset";
@Override
public Object aroundReadFrom(ReaderInterceptorContext ctx) throws IOException, WebApplicationException {
ctx.setProperty(RESTEASY_DEFAULT_CHARSET_PROPERTY, "UTF-8");
return ctx.proceed();
}
}
接下來,攔截器添加到網頁。xml: <context-param> <param-name>resteasy.providers</param-name> <param-value>
x.y.z.RestEasyDefaultCharsetInterceptor </param-value> </context-param>
現在,我還沒有完全理解整個機制,但你應該應該還能夠通過指定內容類型的charset參數來解決客戶端問題。
是否應該有一個'@ Produces'註釋? (可能是在課堂上。) –
謝謝,我會嘗試一下,但我不知道這個註釋是否會影響方法內部(產生輸出之前)的內容?換句話說,它可以使System.out.println顯示正確的字符嗎? – Wojtek
如果'System.out.println()'編碼是您唯一的實際問題,那麼您基本上需要將它配置在負責呈現stdout的編碼的一側。如果它是例如Eclipse,然後前往這個答案:http://stackoverflow.com/questions/13452324/arabic-letters-giving-me-output-as/13452715#13452715請注意,這有**完全沒有**使用Tomcat/Servlets/JAX-RS/RESTeasy。 – BalusC