6

質問のリストを返す非常に単純な残りの Web サービスがあります。このコードは、返される質問の数が 0 より大きい場合に期待どおりに機能します。しかし、サーバーが [] のような空の json 配列を返した場合、JAXB は、すべてのフィールドが null に設定された 1 つの質問インスタンスを含むリストを作成します!

私は 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.ObjectMapperおよびorg.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 に答える