JsonParseException: неожиданный символ ('i' (код 105)): ожидалось двойная кавычка - PullRequest
0 голосов
/ 20 ноября 2018

Я пытаюсь интегрировать потоки Spring Cloud и публиковать пользовательский объект Java в службах с RabbitMQ в качестве посредника. Публикуемый мной объект выглядит так:

public class AppMessageEnvelope implements Serializable {
  ...
  private Object messageBody;
  private Date sentAt = new Date();
  ...

  // setters and getters
}

Это просто объект-обертка, и исходный объект помещается в messageBody. Объект, который я помещаю в messageBody, выглядит так:

public class Job {
    ...
    private String message;
    private Map<MyEnum, String> myMap;
    ...
}

Обратите внимание, что и AppMessageEnvelope, и Job находятся в другом проекте модель , который импортируется как зависимость Maven в проектах Spring Boot издателя и подписчика, поэтому модели в точности совпадают.

В производителе я публикую объект как:

@EnableBinding(Source.class)
public class JobDistributor {

    private final Source jobQueue;

    @Autowired
    public JobDistributor(Source jobQueue) {
        this.jobQueue = jobQueue;
    }

    public AppMessageEnvelope publishJob(AppMessageEnvelope message) {
        LOG.info("Sending message: {}.", message);
        jobQueue.output().send(MessageBuilder.withPayload(message).build());
        return message;
    }
}

В потребителе я получаю сообщение как:

@Component
@EnableBinding(Sink.class)
public class JobConsumer {

    private final JobManager jobManager;
    private final ObjectMapper objectMapper;

    @Autowired
    public JobConsumer(
            JobManager jobManager, ObjectMapper objectMapper) {
        this.jobManager = jobManager;
        this.objectMapper = objectMapper;
    }

    @StreamListener(target = Sink.INPUT)
    public void processData(AppMessageEnvelope messageEnvelope) {
        LOG.info("Envelope received: {}.", messageEnvelope);

        try {
            TypeReference<Job> mapType = new TypeReference<Job>() {};
            Job job = objectMapper.readValue(messageEnvelope.getMessageBody().toString(), mapType);
            jobManager.processRequest(job);
        } catch (Exception ex) {
            LOG.error("Couldn't convert to correct object for processing: {}.", ex);
        }
    }
}

Я пытаюсь использовать TypeReference для преобразования внутреннего объекта в правильный объект, но я получаю сообщение об ошибке:

JobConsumer - Couldn't convert to correct object for processing: {}.
    com.fasterxml.jackson.core.JsonParseException: Unexpected character ('i' (code 105)): was expecting double-quote to start field name
    at [Source: (StringReader); line: 1, column: 3]

Перед преобразованием сообщения я его регистрирую:

JobConsumer - Envelope received: AppMessageEnvelope{..., messageBody={id=5bf3a7302dbe9c7cf9927c60, jobId=8c0bfcb0b21248e694b5cd52337a1f9e, submittedAt=2018-11-20T06:18:24+0000, lastUpdatedOn=null, message=null, ..., fileContentMap={FILE_BYTES=JVBERi0xLjUKJb/3ov}}, sentAt=Tue Nov 20 11:48:24 IST 2018}

Я попытался настроить ObjectMapper как:

@Autowired
private ObjectMapper objectMapper() {
    JsonFactory factory = new JsonFactory();
    factory.enable(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES);
    return new ObjectMapper(factory);
}

Я также попытался включить поля без кавычек:

objectMapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);

Я пробовал решения, предоставленные этого блога и некоторые подобные проблемы SO, но ничего не решено. Чего мне не хватает?

1 Ответ

0 голосов
/ 13 августа 2019

Используйте приведенное ниже преобразование JSON для преобразования JSON в модель / сущность

ObjectMapper objectMapper = new ObjectMapper();
Job job = objectMapper.convertValue(messageEnvelope.getMessageBody().toString(), Job.class);
...