我有角度应用程序,我希望在用户必须登录时为该案例创建一个小型会话商店,但应该能够从他离开页面的地方继续。
存储部分非常简单,因为我按原样存储了收到的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
}
}
答案 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。如果客户认为他不再解析内容。