私は、送信者のサービスに、それはのように定義され、メッセージとしてのRabbitMQを介して送信されているクラスがあります。
public final class User implements Serializable {
private String nome;
private String cognome;
public User(@JsonProperty("nome") String nome,
@JsonProperty("cognome") String cognome) {
this.nome = nome;
this.cognome = cognome;
}
public String getNome() {
return nome;
}
public String getCognome() {
return cognome;
}
public User(){}
}
そして、受信サービスで:
@Document
public class Persona {
@Id
@JsonProperty
public ObjectId id;
private String nome;
private String cognome;
public String getId() {
return id.toHexString();
}
public void setId(ObjectId id) {
this.id = id;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getCognome() {
return cognome;
}
public void setCognome(String cognome) {
this.cognome = cognome;
}
public Persona(ObjectId id, String nome, String cognome) {
this.id = id;
this.nome = nome;
this.cognome = cognome;
}
public Persona(){}
}
受信機のコントローラでは、私は、そのメッセージを取る必要があり、以下の方法を、持っているオブジェクトにキャストし、データベースに保存し、それは次のようになります。
@RabbitListener(queues = {"default_parser_q"})
public void receiveMessage(final Message message){
ObjectMapper mapper = new ObjectMapper()
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false)
.configure(DeserializationFeature.FAIL_ON_NULL_FOR_PRIMITIVES, false);
mapper.readValue(message.getBody(), Persona.class);
System.out.println(message.toString() + "the message has been received");
}
問題は、私は上の例外を取得していますということですreadValue()
具体的には、この方法:
未処理の例外:java.io.IOExceptionの、com.fasterxml.jackson.core.JsonParseException、com.fasterxml.jackson.databind.JsonMappingException
この場合、送信されたメッセージ(JSON)は、次のとおりです。
{
'nome': "John",
'cognome': "Doe"
}
何が私がここに間違っているのでしょうか?
編集:要求されたとして、スタックトレースを追加します。
com.fasterxml.jackson.databind.exc.MismatchedInputExceptionは:のインスタンスを作成することはできません
demo.com.fetcherservice.models.Persona
(少なくとも一つのクリエータが存在していないが):(バイト[[元に文字列値からデシリアライズへの文字列引数コンストラクタ/ファクトリメソッド(「{ 『ドウ』 『ノーム』: 『ジョン』、 『cognomeを』}」) ]) "" {\ n \ T \ T \ T \ "ノーム\":\ "ジョン\"、\ N \ T \ T \ T \ "cognome \":\ "ドウ\" \ n \ T \ T }「」。行1、列:1] COMでcom.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1343)でcom.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:63)でcom.fasterxml.jackson.databindでcom.fasterxml.jackson.databind.deser.ValueInstantiator._createFromStringFallbacksで.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1032)(ValueInstantiator.java:371)。demo.com.fetcherservice.models.Persona
(少なくとも一つのクリエータが存在していないが):(バイト[[元に文字列値からデシリアライズへの文字列引数コンストラクタ/ファクトリメソッド(「{ 『ドウ』 『ノーム』: 『ジョン』、 『cognomeを』}」) ]) "" {\ n \ T \ T \ T \ "ノーム\":\ "ジョン\"、\ N \ T \ T \ T \ "cognome \":\ "ドウ\" \ n \ T \ T }「」。行1、列:1] COMでcom.fasterxml.jackson.databind.DeserializationContext.reportInputMismatch(DeserializationContext.java:1343)でcom.fasterxml.jackson.databind.exc.MismatchedInputException.from(MismatchedInputException.java:63)でcom.fasterxml.jackson.databindでcom.fasterxml.jackson.databind.deser.ValueInstantiator._createFromStringFallbacksで.fasterxml.jackson.databind.DeserializationContext.handleMissingInstantiator(DeserializationContext.java:1032)(ValueInstantiator.java:371)。
それはあなたにも春を使用しているので、私はそれは同じだと仮定し、私はカフカのために見てきた行動のように見えます。
あなたの送信側JSONにオブジェクトを変換し、それを文字列として送信します- (エラーメッセージで、したがってエスケープ引用符\"nome\": \"John\",\n\t\t\t\"cognome\": \"Doe\"
)。
あなたは、送信者側でJsonSerializerを宣言し、それを渡す必要があり、あなたのUser
、または-手動でJSON文字列を作成する場合-春は引用符や空白を脱出しようとしないので、それはバイト配列だ宣言すること。