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 时遇到了同样的问题。

从自定义客户端上传表单/多部分时,客户端确实发送了内容类型,但没有字符集,然后 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>

于 2016-08-31T07:52:19.793 回答
0

这与 resteasy 或 jax-rs mate 无关。

检查这个帖子

您可能需要研究几件事:

  1. 如果数据来自 DB,那么您需要确保 DB 中的数据编码正确。
  2. 您的 JVM 环境正在使用 utf8 进行编码
  3. 这可能是 IDE 的问题,因为 IDE 和您的 tomcat 可能在不同的配置上运行。
于 2013-02-06T08:06:38.663 回答
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);
}

}

只需更改urlPatterns即可过滤您的 Resteasy 资源。

于 2016-01-20T02:52:15.337 回答
0

这对我有用

@Produces(MediaType.APPLICATION_JSON+";charset=UTF-8")
于 2020-01-22T03:34:20.693 回答
0

如果您的 API 的使用者不能轻易地将字符集设置为 UTF-8(例如:使用 fetch 和 FormData),那么 RestEasy 默认使用美国 ASCII 编码。因此,如果您使用的是非 ascii 字符,它们的编码就会出现乱码。
对我有用的是将输入表单参数视为 byte[] 并自己使用 utf-8 字符集进行字符串转换。

@FormParam("data")
private byte[] data;
于 2020-08-18T13:29:10.867 回答