媒体类型为application/xml的消息体写入器未找到。

4
我希望能够根据请求的HttpHeaders,以两种格式生成REST API响应:
@Context
HttpHeaders headers; 

public Response toResponse(MyValidationException exception) {
   if(headers.getMediaType().toString().equals(MediaType.APPLICATION_XML)){
     return Response.status(Status.BAD_REQUEST).entity(exception.getErrors()).type(MediaType.APPLICATION_XML).build();
  }else{
     return Response.status(Status.BAD_REQUEST).entity(exception.getErrors()).type(MediaType.APPLICATION_JSON).build();
}}

它适用于MediaType.APPLICATION_JSON,但对于MediaType.APPLICATION_XML,我会得到以下错误:
org.glassfish.jersey.message.internal.WriterInterceptorExecutor$TerminalWriterInterceptor.aroundWriteTo MessageBodyWriter not found for media type=application/xml, type=class java.util.HashMap$EntrySet, genericType=class java.util.HashMap$EntrySet.

有没有解决这个问题的想法?
2个回答

7

您的项目中是否有jaxb依赖项?

<dependency>
  <groupId>org.glassfish.jersey.media</groupId>
  <artifactId>jersey-media-jaxb</artifactId>
  <version>x.x.x</version>
</dependency>

如果是的话,也许你可以尝试将 exception.getErrors() (看起来是一个 Map?)包装成一个 GenericEntity 并将该实体提供给响应:

GenericEntity<Map<?, ?>> entity = new GenericEntity..

return Response.status(Status.X).entity(entity).type(MediaType.APPLICATION_XML).build();

为了抛出异常,我写了以下代码: GenericEntity<Map<String,String>> entity = (GenericEntity<Map<String,String>>) exception.getErrors(); 但是程序抛出了以下异常: java.lang.ClassCastException: java.util.HashMap cannot be cast to javax.ws.rs.core.GenericEntity - Brahim LAMJAGUAR
不要直接“转换”对象,只需重新创建它: GenericEntity<Map<String,String>> entity = new GenericEntity<Map<String,String>>(exception.getErrors()){}; - ialex
我尝试了,但我有与帖子相同的第一个问题 :/ - Brahim LAMJAGUAR
在我的情况下,我还必须使用继承ResourceConfig的JerseyConfig中的packages方法注册jersey-media-jaxb依赖项的包。这可能取决于类路径中版本的组合。 - Gabriel Xunqueira

1

根据ialex的描述,添加GenericEntity<>解决了我的问题。我做了以下操作:

GenericEntity<List<?>> genericEntity = new GenericEntity<List<?>> (exception.getErrors()) {};
Response.status(Status.BAD_REQUEST).entity(genericEntity).build();

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接