2015-03-20 1 views
1

Я создаю спокойный веб-сервис в JBoss AS 7.1.1 Final. Он отлично работает, пока мне не нужен специальный десериализатор. Код:Restful jboss Deserialize

@Entity 
@DiscriminatorColumn(name = "tipo") 
@Table(name = "debitavel", schema = "despesas_db") 
@Inheritance(strategy = InheritanceType.JOINED) 
@JsonDeserialize(using = DebitavelDeserializer.class) 
@JsonSerialize(using = DebitavelSerializer.class) 
public abstract class Debitavel { 

} 

Этот класс имеет 2 подкласса:

@Entity 
@Table(name = "conta", schema = "despesas_db") 
@DiscriminatorValue(value = "CONTA") 
public class Conta extends Debitavel { 
} 

@Entity 
@DiscriminatorValue(value = "CONTA") 
@Table(name = "cartao", schema = "despesas_db") 
public class CartaoCredito extends Debitavel { 
} 

И у меня есть этот класс использует Debitavel:

@Entity 
@Table(name = "despesa", schema = "despesas_db") 
@DiscriminatorValue(value = "D") 
public class Despesa { 

    @Column 
    private String descricao; 

    @ManyToOne 
    @JoinColumn(name = "debitavel_id") 
    protected Debitavel debitavel; 

} 

Так на странице я посылаю JSON как тот

{ 
    "descricao": "TESTE", 
    "debitavel": { 
     "id": 101, 
     "descricao": "Conta1", 
     "cor": "#ff0000", 
     "tipo": "CONTA" 
    } 
} 

Итак, я хочу класс, создающий ai nstance из CartaoCredito или Конта, основанный в atributte Tipo, поэтому я строю десериализатор:

public class DebitavelDeserializer extends JsonDeserializer<Debitavel> { 

     @Override 
     public Debitavel deserialize(JsonParser jp, DeserializationContext ctxt)  throws IOException, JsonProcessingException { 
       //staff to create Conta or CartaoCredito 
     } 

}

И мой pom.xml:

  <dependency> 
      <groupId>org.codehaus.jackson</groupId> 
      <artifactId>jackson-core-asl</artifactId> 
      <version>1.9.12</version> 
     </dependency> 

     <dependency> 
      <groupId>org.codehaus.jackson</groupId> 
      <artifactId>jackson-mapper-asl</artifactId> 
      <version>1.9.12</version> 
     </dependency> 

Однако, когда я попытался развернуть app, jboss говорит, что Debitavel - абстрактный класс, и он не может создать экземпляр. Я искал решение, и я попробовал несколько решений:

  • Создайте jboss-deployment-structure.xml с модулями из jboss и измените предоставленный pom.xml;
  • Измените модуль для отдыха resteasy;
  • переход на новый jackson 2.x;

Это означает, что jboss просто игнорирует эти аннотации.

ТКС

ответ

1

Я решил ... но если честно, я не понимаю, почему, так что давайте посмотрим:

Я изменил pom.xml к

 <dependency> 
      <groupId>org.jboss.resteasy</groupId> 
      <artifactId>resteasy-jaxrs</artifactId> 
      <version>2.3.2.Final</version> 
      <scope>provided</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.jboss.resteasy</groupId> 
      <artifactId>resteasy-multipart-provider</artifactId> 
      <version>2.3.2.Final</version> 
      <scope>provided</scope> 
     </dependency> 

     <dependency> 
      <groupId>org.jboss.resteasy</groupId> 
      <artifactId>resteasy-jackson-provider</artifactId> 
      <version>2.3.2.Final</version> 
     </dependency> 

И все работает просто хорошо. Кто-то может объяснить, почему это работает?

+0

Добавление зависимости от resteasy-jackson-provider также помогает мне. –