0

Jersey と Genson を使用して POST 呼び出しを実行しようとすると、次の問題が発生します。

.... com.owlike.genson.JsonBindingException: 型インターフェイス Animal のコンストラクターが見つかりません ....

私は次の設定をしています:

-> Animal.java

package com.test;

import org.codehaus.jackson.annotate.JsonSubTypes;
import org.codehaus.jackson.annotate.JsonTypeInfo;

@JsonTypeInfo(use = JsonTypeInfo.Id.NAME, include = JsonTypeInfo.As.PROPERTY, property = "type")
@JsonSubTypes( {@JsonSubTypes.Type(value = Dog.class, name = "dog") })
public interface Animal
{  }

-> Dog.java

package com.test;

import org.codehaus.jackson.annotate.JsonTypeName;
import org.codehaus.jackson.annotate.JsonProperty;

@JsonTypeName("dog")
public class Dog implements Animal
{
   @JsonProperty
   public String name;

   public String getName() { return name; }
   public void setName(String n) { this.name = n; }
}

-> Zoo.java

package com.test;

import java.util.List;

public class Zoo
{
   private List<Animal> animals;
   public List<Animal> getAnimals()
   {
     return animals;
   }

   public void setAnimals(List<Animal> animals)
   {
    this.animals = animals;
    } 
 }

-> GensonCustomResolver.java

package com.test;
import javax.ws.rs.next.ContextResolver;
import javax.ws.rs.next.Provider;

import com.owlike.genson.Genson;

@Provider
public class GensonCustomResolver implements ContextResolver<Genson>
{
   private final Genson genson = new      Genson.Builder().useRuntimeType(true).useClassMetadata(true).create();

   @Override
   public Genson getContext(Class<?> arg0)
   {
     return genson;
   }
}

-> JerseyService.java

package com.test;

import javax.ws.rs.*;
import org.codehaus.jackson.*;

@Path("/exampleservice")
public class JerseyService 
{


   @POST
   @Path("somePath")
   @Consumer(MediaType.APPLICATION_JSON)
   @Produces(MediaType.APPLICATION_JSON)
   public Zoo createAnotherZoo(Zoo zoo) throws JsonParseException, JsonMappingException, Exception
   {
      Zoo newZoo = new Zoo();
      Collection<Animal> animals = zoo.getAnimals();
      List<Animal> newAnimals = new ArrayList<Animal>();

      for (Animal a : animals) {
          Dog dog_a = (Dog) a;
          Dog dog_b = new Dog();
          dog_b.setName(dog_a.getName() + "TEST");
          newAnimals.add(dog_b);
      }
      newZoo.add(newAnimals);
      return newZoo;
   }
}

入力 JSON は次のようになります。

{
   "animals" : [
     {
       "name": "Unno"
     }
    ]
}

要約すると、List があり、オブジェクトを逆シリアル化するときにインターフェイスの実装の 1 つを使用しようとしています。

前もって感謝します。

::::解決:::::

誰かがこれに遭遇した場合:

以下に示すように、genson の依存関係を完全に削除しました。ジャクソンの注釈のみを使用し、機能しているように見えました。また、Dog.java の name 属性から @JsonProperty を削除しました。

ありがとうございました :) :)

4

1 に答える 1