2013-02-04 34 views
0

我在RESTeasy中編碼字符串時遇到問題。問題是中文字母或任何其他非拉丁字符不能正確顯示。如果我嘗試打印出來(或作爲迴應發送),我會得到「?????」代替。 我相信RESTeasy中的默認編碼是us-ascii。你知道如何將它改爲UTF-8嗎?也許這個問題有另一種解決方案?如何在RESTeasy中將編碼設置爲UTF-8?

這裏是從我的代碼很短的一段話:

@POST 
@Path("post") 
@Consumes(MediaType.MULTIPART_FORM_DATA) 
public String uploadData(@MultipartForm DataUploadForm uploadForm) { 

... 

//the code below is just for the purpose of presentation 

String text = "some non-latin alphabet signs here" 
System.out.println(text); // "??????" is printed out 

return text; //"??????" is returned 
} 

我RestEasy的-JAXRS-3.0-β-2在Tomcat 7.0上運行。

謝謝!

+0

是否應該有一個'@ Produces'註釋? (可能是在課堂上。) –

+0

謝謝,我會嘗試一下,但我不知道這個註釋是否會影響方法內部(產生輸出之前)的內容?換句話說,它可以使System.out.println顯示正確的字符嗎? – Wojtek

+0

如果'System.out.println()'編碼是您唯一的實際問題,那麼您基本上需要將它配置在負責呈現stdout的編碼的一側。如果它是例如Eclipse,然後前往這個答案:http://stackoverflow.com/questions/13452324/arabic-letters-giving-me-output-as/13452715#13452715請注意,這有**完全沒有**使用Tomcat/Servlets/JAX-RS/RESTeasy。 – BalusC

回答

0

這不是關於resteasy或jax-rs隊友。

檢查this post

有可能要考慮幾件事情:

  1. 如果數據是從數據庫,那麼你需要使它正確編碼DB肯定的數據。
  2. 您的JVM環境使用utf8編碼
  3. 這可能是IDE的一個問題,因爲IDE和您的tomcat可能運行在不同的 配置中。
6

對於因問題標題來到這裏的人來說,這裏有一個解決方案。在您的@Consumes註釋中,嘗試將字符集設置爲UTF-8:

@Consumes(MediaType.MULTIPART_FORM_DATA+";charset=UTF-8"); 
+0

爲我的resteasy 2.3.2,更新@Consume後,我得到以下錯誤:失敗執行POST [TheUrl]:org.jboss.resteasy.spi.UnsupportedMediaTypeException:不能使用內容類型 – davs

+0

你在發送什麼您的POST請求的內容類型標題?如果你直接拷貝我的例子,它需要是「multipart/form-data」。如果您沒有上傳表單中的文件,則需要相應地更新MediaType。 –

0

我創建了一個web過濾器。我不知道這是否是最好的方法,但它確實解決了這個問題。

@WebFilter(filterName = "CharacterEncodingFilter", urlPatterns = {"/api/*"}) 
public class CharacterEncodingFilter implements Filter { 

public CharacterEncodingFilter() { 
} 

@Override 
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException 
{  
    // setting the charset 
    response.setCharacterEncoding(StandardCharsets.UTF_8.toString()); 
    chain.doFilter(request, response); 
} 

} 

只要改變URL模式所以它可以過濾RestEasy的資源。

0

我有同樣的問題將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參數來解決客戶端問題。

相關問題