我有一个非常简单的Rest Web服务,它返回一个问题列表。当返回的问题数大于零时,此代码将按预期工作。但是,如果服务器返回像[]这样的空json数组,则JAXB会创建一个包含一个问题实例的列表,其中所有字段均设置为null!

我是Jersey和JAXB的新手,所以我不知道我是否配置不正确,或者这是否是已知问题。有小费吗?

客户端配置:

 DefaultApacheHttpClientConfig config = new DefaultApacheHttpClientConfig(); 
 config.getProperties().put(DefaultApacheHttpClientConfig.PROPERTY_HANDLE_COOKIES, true); 
 config.getClasses().add(JAXBContextResolver.class); 
 //config.getClasses().add(JacksonJsonProvider.class); // <- Jackson causes other problems 
 
 client = ApacheHttpClient.create(config); 

JAXBContextResolver:
@Provider 
 public final class JAXBContextResolver implements ContextResolver<JAXBContext> { 
 
  private final JAXBContext context; 
  private final Set<Class> types; 
  private final Class[] cTypes = { Question.class }; 
 
  public JAXBContextResolver() throws Exception { 
   this.types = new HashSet(Arrays.asList(cTypes)); 
   this.context = new JSONJAXBContext(JSONConfiguration.natural().build(), cTypes); 
  } 
 
  @Override 
  public JAXBContext getContext(Class<?> objectType) { 
   return (types.contains(objectType)) ? context : null; 
  } 
 
 } 

客户代码:
public List<Question> getQuestionsByGroupId(int id) { 
    return digiRest.path("/questions/byGroupId/" + id).get(new GenericType<List<Question>>() {}); 
} 

Question类只是一个简单的pojo。

请您参考如下方法:

我知道这并不完全是您的问题的答案,但是对于当前的项目,我选择在 Jersey 上面使用GSON。 (并且我尝试尽可能避免使用JAXB),我发现它非常容易且具有弹性。

您只需要声明

@Consumes(MediaType.TEXT_PLAIN) 

或者
@Produces(MediaType.TEXT_PLAIN) 

或同时使用两者,并使用GSON编码器/解码器,并使用纯字符串。非常容易调试,也可以进行单元测试...


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!