3

RESTeasy での文字列のエンコードに問題があります。問題は、漢字やその他の非ラテン文字が正しく表示されないことです。それらを印刷しようとすると (または応答として送信しようとすると)、「?????」が表示されます。代わりは。RESTeasy のデフォルトのエンコーディングは us-ascii だと思います。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-beta-2 は Tomcat 7.0 で実行されています。

ありがとうございました!

4

6 に答える 6

10

質問のタイトルのためにここに来た人のために、ここに解決策があります。@Consumes アノテーションで、文字セットを UTF-8 に設定してみてください。

@Consumes(MediaType.MULTIPART_FORM_DATA+";charset=UTF-8");
于 2014-01-30T22:55:51.093 に答える
2

jaxrs1 (ジャージー) を resteasy 3.0.17.final に移行する際にも同じ問題がありました。

カスタムクライアントからフォーム/マルチパートをアップロードするとき、クライアントはコンテンツタイプを送信しましたが、charset は送信されず、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();
    }
}

次に、web.xml にインターセプターを追加し ます。メカニズム全体はまだ完全には理解できていませんが、content-type に charset パラメーターを指定することで、クライアント側の問題を修正できるはずです。 <context-param> <param-name>resteasy.providers</param-name> <param-value>
x.y.z.RestEasyDefaultCharsetInterceptor </param-value> </context-param>

于 2016-08-31T07:52:19.793 に答える
0

ウェブフィルターを作成しました。それが最善の方法であるかどうかはわかりませんが、確かに問題は解決します。

@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);
}

}

Resteasy リソースをフィルタリングできるようにurlPatternsを変更するだけです。

于 2016-01-20T02:52:15.337 に答える
0

これは、resteasy や jax-rs mate に関するものではありません。

この投稿をチェック

調べたいことがいくつかあります。

  1. データが DB からのものである場合、DB 内のデータが正しくエンコードされていることを確認する必要があります。
  2. JVM 環境は utf8 を使用してエンコードしています
  3. IDE と Tomcat が異なる構成で実行されている可能性があるため、これは IDE の問題である可能性があります。
于 2013-02-06T08:06:38.663 に答える