我在将 jaxrs1(球衣)迁移到 resteasy 3.0.17.final 时遇到了同样的问题。
从自定义客户端上传表单/多部分时,客户端确实发送了内容类型,但没有字符集,然后 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:
现在,我还没有完全理解整个机制,但是您应该也可以通过将 charset 参数指定为 content-type 来解决客户端的问题。
<context-param>
<param-name>resteasy.providers</param-name>
<param-value>
x.y.z.RestEasyDefaultCharsetInterceptor
</param-value>
</context-param>