如何使用JAX-RS设置charset?我已经尝试@Produces("text/html; charset=UTF-8")但是被忽略了,只有text/htmlHTTP头发送.我想在MessageBodyWriter中设置charset,但不希望通过我自己的反射分析@Produces注释来提取媒体类型.
我使用Jersey 1.11制作了一个小型的Rest Web服务.当我调用返回Json的url时,非英文字符的字符编码存在问题.Xml的相应url("test.xml"在启动的xml-tag中使其成为utf-8.
如何让网址"test.json"返回utf-8编码的响应?
这是服务的代码:
@Stateless
@Path("/")
public class RestTest {
@EJB
private MyDao myDao;
@Path("test.xml/")
@GET
@Produces(MediaType.APPLICATION_XML )
public List<Profile> getProfiles() {
return myDao.getProfilesForWeb();
}
@Path("test.json/")
@GET
@Produces(MediaType.APPLICATION_JSON)
public List<Profile> getProfilesAsJson() {
return myDao.getProfilesForWeb();
}
}
Run Code Online (Sandbox Code Playgroud)
这是服务使用的pojo:
package se.kc.mimee.profile.model;
@XmlRootElement
public class Profile {
public int id;
public String name;
public Profile(int id, String name) {
this.id = id;
this.name = name;
}
public Profile() {}
}
Run Code Online (Sandbox Code Playgroud) 我一直在搜索net和stackoverflow,以获取使用servlet过滤器将内容插入响应的示例,但只能找到捕获/压缩输出和/或更改标头的人的示例.我的目标是在所有HTML响应的结束</ body>之前附加一大块HTML.
我正在研究扩展HttpServletResponseWrapper的解决方案,以使用我自己的PrintWriter,然后覆盖其上的write方法.在write方法中,我存储了最后7个字符,看它是否等于关闭body标签,然后我写了我的HTML块加上关闭的body标签,然后继续对文档的其余部分进行正常的写操作.
我觉得有人必须已经解决了这个问题,而且可能比我更优雅.我很欣赏如何使用servlet过滤器将内容插入响应的任何示例.
更新
回应评论,我也试图从http://www.oracle.com/technetwork/java/filters-137243.html实现CharResponseWrapper .这是我的代码:
PrintWriter out = response.getWriter();
CharResponseWrapper wrappedResponse = new CharResponseWrapper(
(HttpServletResponse)response);
chain.doFilter(wrappedRequest, wrappedResponse);
String s = wrappedResponse.toString();
if (wrappedResponse.getContentType().equals("text/html") &&
StringUtils.isNotBlank(s)) {
CharArrayWriter caw = new CharArrayWriter();
caw.write(s.substring(0, s.indexOf("</body>") - 1));
caw.write("WTF</body></html>");
response.setContentLength(caw.toString().length());
out.write(caw.toString());
}
else {
out.write(wrappedResponse.toString());
}
out.close();
Run Code Online (Sandbox Code Playgroud)
我也在包装请求,但该代码有效,不应影响响应.
我是servlet的新手,并阅读有关过滤器和包装器的一些文本.我可以理解过滤器,但对包装器感到困惑.在书中,作者给出了一个例子:
如果没有包装:
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
String name = request.getParameter("name").trim();
try {
chain.doFilter(request, response);
PrintWriter out = response.getWriter();
if (name.length() == 0) {
out.println("Some message");
out.println("</body>");
out.println("</html>");
out.close();
}
} catch (Throwable t) {
}
}
Run Code Online (Sandbox Code Playgroud)
如果是包装:
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {
String name = request.getParameter("name").trim();
HttpServletResponse httpRes = (HttpServletResponse) response;
HttpServletResponseWrapper resWrapper = new HttpServletResponseWrapper(httpRes);
try {
chain.doFilter(request, response);
PrintWriter out = resWrapper.getWriter(); // …Run Code Online (Sandbox Code Playgroud) 我想Expires为所有image/*和设置标题text/css.我正在这样做Filter.然而:
chain.doFilter(..)Content-type 之前还没有"实现"chain.doFilter(..)Content-type 后,内容长度也是如此,禁止添加新标题(至少在Tomcat实现中)我可以使用所请求资源的扩展,但由于某些css文件是由richfaces通过从jar文件中获取而生成的,因此文件的名称不是x.css,但是/xx/yy/zz.xcss/DATB/....
那么,有没有办法在提交响应之前获取Content-type.
我有一个球衣客户端,我试图解组一个响应实体.问题是远程Web服务发送回application/octet-stream作为内容类型,因此Jersey不知道如何解组它(我有类似的错误,text/html回来用于XML等).我无法更改Web服务.
我想要做的是覆盖内容类型并将其更改为application/json,以便jersey知道要使用哪个编组器.
我无法使用json marshaller注册application/octet-stream,因为对于给定的内容类型,我实际上可能会找回各种奇怪的东西.