6

我有一个非常简单的休息网络服务返回问题列表。当返回的问题数大于零时,此代码按预期工作。但是,如果服务器返回一个空的 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。

4

2 回答 2

0

使用杰克逊可能会有所帮助。见org.codehaus.jackson.map.ObjectMapperorg.codehaus.jackson.map.annotate.JsonSerialize.Inclusion.NON_EMPTY

import org.codehaus.jackson.map.ObjectMapper;
import org.codehaus.jackson.map.annotate.JsonSerialize;

public class SampleContextResolver implements ContextResolver<ObjectMapper>
{
        @Override
        public ObjectMapper getContext(Class<?> type)
        {
            ObjectMapper mapper = new ObjectMapper();

            mapper.setSerializationConfig(mapper.getSerializationConfig()
                .withSerializationInclusion(JsonSerialize.Inclusion.NON_EMPTY)
        }
}
于 2012-08-07T18:01:13.727 回答
0

我知道这不完全是您问题的答案,但我选择在球衣上使用 GSON,用于我当前的项目。(我尽量避免使用 JAXB),我发现它非常简单且有弹性。

你只需要声明

@Consumes(MediaType.TEXT_PLAIN)

或者

@Produces(MediaType.TEXT_PLAIN)

或两者兼而有之,并使用 GSON 编组器/解组器,并使用纯字符串。非常容易调试,单元测试也...

于 2012-05-04T08:16:55.277 回答