关于JWT响应所需javax.ws.rs MediaType及@Produces注解使用的技术问询
关于JWT响应的MediaType问题解答
嘿,我来帮你理清这个JWT和MediaType的问题~
1. JWT响应对应的javax.ws.rs MediaType
JWT的标准媒体类型是application/jwt,不过在javax.ws.rs.core.MediaType类里并没有预先定义这个常量,所以你有两种实用的选择:
- 直接在代码里使用字符串常量
"application/jwt" - 自己定义一个静态常量统一引用,让代码更规范,比如:
public static final String APPLICATION_JWT = "application/jwt";
2. 解决@Produces("application/jwt")的报错问题
你碰到的"No message body writer has been found"错误,本质是JAX-RS框架找不到能把你的JWT对象序列化为application/jwt类型响应的消息体写入器,这里有两种解决方案:
方法一:自定义MessageBodyWriter
你可以实现javax.ws.rs.ext.MessageBodyWriter接口,专门处理JWT的序列化逻辑。举个基于JJWT库的简单示例:
@Provider @Produces("application/jwt") public class JwtMessageBodyWriter implements MessageBodyWriter<String> { @Override public boolean isWriteable(Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) { return String.class.isAssignableFrom(type) && mediaType.equals(MediaType.valueOf("application/jwt")); } @Override public long getSize(String jwt, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType) { return -1; // 交给容器自动计算响应长度 } @Override public void writeTo(String jwt, Class<?> type, Type genericType, Annotation[] annotations, MediaType mediaType, MultivaluedMap<String, Object> httpHeaders, OutputStream entityStream) throws IOException, WebApplicationException { entityStream.write(jwt.getBytes(StandardCharsets.UTF_8)); } }
别忘了加上@Provider注解,这样JAX-RS框架会自动识别并使用这个写入器。
方法二:用JSON格式返回JWT(更省心的替代方案)
如果不想自定义写入器,也可以直接用application/json类型返回JWT,把JWT字符串包装在JSON对象里,比如:
@GET @Path("/token") @Produces(MediaType.APPLICATION_JSON) public Response getJwtToken() { String jwt = "生成好的JWT字符串"; return Response.ok(Map.of("token", jwt)).build(); }
这种方式不需要额外配置,直接就能运行,也是很多实际项目里常用的JWT返回方式。
内容的提问来源于stack exchange,提问作者Raveen Athapaththu
相关产品推荐
相关产品推荐

