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>