Java JerseryAPI主体编写器问题

Java JerseryAPI主体编写器问题,java,jersey,jersey-client,Java,Jersey,Jersey Client,我为这个问题寻找答案已经有一段时间了,但似乎找不到正确的解决办法。我有一个服务,我在其中调用Web资源,如下所示: @POST @Path("/save") public Response addPushMessage(@FormParam("key") String key, @FormParam("pid") String pid, @FormParam("url") String url, @FormParam(

我为这个问题寻找答案已经有一段时间了,但似乎找不到正确的解决办法。我有一个服务,我在其中调用Web资源,如下所示:

@POST
@Path("/save")

public Response addPushMessage(@FormParam("key") String key, @FormParam("pid") String pid,  
                                    @FormParam("url") String url, @FormParam("message") String message) throws Throwable {
    if(key == null || key.isEmpty() || pid == null || pid.isEmpty())
            return Response.ok().entity("Error: image key and profile Id are required for push message").build();
    try{
         Date now = new Date();
         BasicDBObject pushMsg = new BasicDBObject("key", key).append("provider", pid).append("createdDate", now);
         if(url!= null)
             pushMsg.append("url", url);
         if(message != null && !message.isEmpty())
             pushMsg.append("message", message);
         pushMsg.append("status", status);
         String pushMsgId = ServiceUtil.mongo.put(GliifConstant.pushMsgCollectionName, pushMsg);

         // Notify Event manager to push events if it's PROD
         // Changed it delibrately to dev for local testing
         if(ServiceUtil.env.equalsIgnoreCase("dev")){
             PushEvent event = new PushEvent();
             event.setCreatedDate(now);
             event.setEventId(pushMsgId);
             event.setKey(key);
             event.setUrl(url);
             event.setStatus(status);
             WebResource clientResource = client.resource(pushURL);
             ClientResponse resp = clientResource.type(MediaType.APPLICATION_JSON).post(ClientResponse.class, event);
        }
         if(pushMsgId != null)
             return Response.ok().entity("OK").build();
         else
             return Response.ok().entity("Error: save push notification failed").build(); 
    }
    catch(Throwable t){
        t.printStackTrace();
        logger.error(PushService.class.getSimpleName()+" addPushNotification() failed on key: " + key + " \n", t);
        return Response.status(GliifWebConstants.HTTP_GLIIF_SERVER_ERROR)
                    .header("HTTP_GLIIF_SERVER_ERROR","Gliif RestFull Service addPushNotification() operation caught runtime exception on saving push message on key:"+ key).build();
    }
}
“推送事件”类的代码:

现在,当我运行此命令时,会出现以下错误:

找不到Java类型class
com.glif.model.PushEvent
和MIME媒体类型
application/json
的消息正文编写器


我已经通过stackoverflow论坛尝试了所有可能的方法来纠正这个问题,但是没有成功。有人能帮我解决这个问题吗(

您需要在项目中定义一个类,该类为您的
PushEvent
类实现MessageBodyWriter

@Provider
@Produces(MediaType.APPLICATION_JSON)
public final class PushEventWriter implements MessageBodyWriter<PushEvent> {

    // implement methods and serialization

}
@Provider
@产生(MediaType.APPLICATION_JSON)
公共最终类PushEventWriter实现MessageBodyWriter{
//实现方法和序列化
}
在这个类中,您必须实现将PushEvent转换为JSON的方法。 通过
@Provider
注释,Jersey将找到此编写器并使用它,如果内容应该是JSON(因为
@产生了
注释)

下面是一篇很好的博客文章,描述了这一过程:


希望这能有所帮助。

我找到了解决方案。结果证明jersey配置是错误的。我所做的只是在代码中添加这些行来创建jersey客户端

DefaultClientConfig defaultClientConfig = new DefaultClientConfig();
defaultClientConfig.getClasses().add(JacksonJsonProvider.class);
Client client = Client.create(defaultClientConfig);

错误得到了解决。感谢Chasmo为我指出了正确的方向:)。

我创建了类,但它仍然给我相同的错误。如果jersey找到了该提供商,您可以查看日志吗?新手问题,但我在哪里可以找到您正在谈论的这些日志?你是说服务器日志吗???是的,来自web应用程序的日志。如果您不知道您使用的是什么日志框架,也不知道您在哪里编写日志。我确实找到了日志,jersey也确实找到了messagebodywriter:INFO:Provider classes found:class com.glif.services.PushEventMessageBodyWriter,但它仍然不起作用。
DefaultClientConfig defaultClientConfig = new DefaultClientConfig();
defaultClientConfig.getClasses().add(JacksonJsonProvider.class);
Client client = Client.create(defaultClientConfig);