序列化/映射问题Dropwizard / Jersey

时间:2013-11-23 13:08:42

标签: java jersey jackson jersey-client dropwizard

我正在尝试使用我的POJO映射REST调用。 POJO看起来像这样:

public class ResultWrapper implements Serializable{

  private int total;
  private List<Movies> movies; ... getters and setters

在我使用的电话中:

WebResource webResource = client.resource(RequestURI + URLEncoder.encode(movie, "UTF-8"));

ResultWrapper result = webResource.accept("application/json").get(ResultWrapper.class);

错误:

com.sun.jersey.api.client.ClientHandlerException: A message body reader for Java class models.ResultWrapper, and Java type class models.ResultWrapper, and MIME media type text/javascript; charset=ISO-8859-1 was not found

客户是泽西岛客户。我尝试过从Chrome(Postman)拨打电话,其中返回的应用程序类型为&#34; text / javascript&#34;,而不是&#34; application / json&#34;人们会怎么想?我认为这将是我的问题。

有什么方法可以让ObjectMapper解决它实际上是#34; application / json&#34;而不是&#34; text / javascript&#34;。我已经尝试使用String.class然后我得到了Json对象。

我的目的是使用Jersey客户端的自动映射。

感谢您提供任何建议或建议。

2 个答案:

答案 0 :(得分:2)

尝试添加注释@Produces (MediaType.APPLICATION_JSON )

答案 1 :(得分:0)

你可以试试这个:

@Provider
@Produces(application/json)
public class YourTestBodyWriter implements MessageBodyWriter<ResultWrapper> {

    private static final Logger LOG = LoggerFactory.getLogger(YourTestBodyWriter.class);

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

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

    @Override
    public void writeTo(
        ResultWrapper t,
        Class<?> type,
        Type genericType,
        Annotation[] annotations,
        MediaType mediaType,
        MultivaluedMap<String, Object> httpHeaders,
        OutputStream entityStream) throws IOException, WebApplicationException
    {
        String message = t.someMethod()
        entityStream.write(message.getBytes(Charsets.UTF_8));
        LOG.info(message);
    }

}

在您的应用中添加run():

// Serializer
environment.jersey().register(new YourTestBodyWriter ());   

这是您申请中的正常方式。