Wildfly RestEASY从普通字符串返回json

时间:2015-02-19 15:10:26

标签: json java-ee resteasy

我有角度应用程序,我希望在用户必须登录时为该案例创建一个小型会话商店,但应该能够从他离开页面的地方继续。

存储部分非常简单,因为我按原样存储了收到的jsonstring。但是当我重新调整值时,String被转义为字符串而不是json。有没有办法将字符串(已经是json)作为json对象返回?

@Path("/session")
public class SessionStore extends Application {
    @POST
    @Path("/save/{variable}")
    @Consumes("application/json")
    public boolean save(@PathParam("variable") String var, String json) throws Exception {
        getSession().setAttribute(var, json);
        return true;
    }

    @GET
    @Path("/load/{variable}")
    @Produces("application/json")
    public Object load(@PathParam("variable") String var) {
        return getSession().getAttribute(var); // this string is already a json
    }
}

2 个答案:

答案 0 :(得分:0)

如果您不希望将返回值自动装入json格式,请告诉您的JAX-RS实现使用@Produces("text/plain")返回纯文本而不是json。

@GET
@Path("/load/{variable}")
@Produces("text/plain")
public String load(@PathParam("variable") String var) {
    //the cast may not be necessary, but this way your intention is clearer
    return (String) getSession().getAttribute(var);
}

答案 1 :(得分:0)

我不知道您使用的是哪个JSON序列化程序。我无法用杰克逊再现这种行为。

首先,我会将方法的返回时间更改为String。因为将String转换为JSON-String没有意义,除非它已经是JSON-String,您的JSON序列化程序不应该触及它。如果它想要变得更聪明,你可以为字符串注册自定义MessageBodyWriter

@Provider
@Produces(MediaType.APPLICATION_JSON)
public class JsonStringSerializer implements MessageBodyWriter<String> {

    @Override
    public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
        return type == String.class;
    }

    @Override
    public long getSize(String t, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) {
        return -1;
    }

    @Override
    public void writeTo(String entity, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType,
            MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException {
        entityStream.write(entity.getBytes(Charset.forName("UTF-8")));      
    }

}

我强烈建议不要将@Produces注释更改为text/plain。这可能会导致返回正确的内容,但也会将Content-Type标题更改为text/plain。所以你发送JSON但告诉你的客户端它不是JSON。如果客户认为他不再解析内容。