Как определить набор чатов для сериализации в Quarkus?

Я пытаюсь отправить в другую систему через данные RESTCLIENT, которые находятся в кодировке ISO-8859-1, но у меня возникает ошибка: «com.fasterxml.jackson.databind.JsonMappingException: недопустимый средний байт UTF-8 0xe3».

Я хотел бы изменить кодировку сериализации на ISO-8859-1 вместо UTF-8, возможно?

Если я конвертирую в UTF-8 перед отправкой, это работает, но мне не нужна эта опция, потому что база данных - ISO-8859-1.

Я попытался установить -Dfile.encoding=ISO-8859-1 в JVM, значение изменилось, но ошибка сохраняется.

javax.ws.rs.ProcessingException: com.fasterxml.jackson.databind.JsonMappingException: Invalid UTF-8 middle byte 0xe3
at [Source: (org.jboss.resteasy.specimpl.AbstractBuiltResponse$InputStreamWrapper); line: 1, column: 480] (through reference chain: com.xxxxxxx.xxx.model.scheduler.Scheduler["nmSchedule"])
at org.jboss.resteasy.client.jaxrs.internal.ClientResponse.readFrom(ClientResponse.java:251)
at org.jboss.resteasy.specimpl.BuiltResponse.readEntity(BuiltResponse.java:88)
at org.jboss.resteasy.specimpl.AbstractBuiltResponse.readEntity(AbstractBuiltResponse.java:256)
at org.jboss.resteasy.client.jaxrs.internal.ClientInvocation.extractResult(ClientInvocation.java:163)
at org.jboss.resteasy.client.jaxrs.internal.proxy.extractors.BodyEntityExtractor.extractEntity(BodyEntityExtractor.java:62)
at org.jboss.resteasy.client.jaxrs.internal.proxy.ClientInvoker.invokeSync(ClientInvoker.java:151)
at org.jboss.resteasy.client.jaxrs.internal.proxy.ClientInvoker.invoke(ClientInvoker.java:112)
at org.jboss.resteasy.client.jaxrs.internal.proxy.ClientProxy.invoke(ClientProxy.java:76)
at com.sun.proxy.$Proxy124.findByIdSchedule(Unknown Source)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.base/java.lang.reflect.Method.invoke(Method.java:566)
at org.jboss.resteasy.microprofile.client.ProxyInvocationHandler.invoke(ProxyInvocationHandler.java:149)
at com.sun.proxy.$Proxy125.findByIdSchedule(Unknown Source)
at com.xxxxxxx.xxx.services.materialization.MaterializationSchedulerService.saveScheduler(MaterializationSchedulerService.java:28)

person Emerson    schedule 18.05.2020    source источник


Ответы (2)


JSON должен быть закодирован в UTF-8, UTF-16 или UTF-32, см. https://tools.ietf.org/html/rfc7159#section-8.1

Джексон автоматически определяет, какой вариант UTF он должен поддерживать. Как объясняется в этом ответе SO, вы можете переопределить этот механизм, предоставив JsonGenerator для ObjectMapper : Jackson ObjectMapper с кодировкой UTF-8?

В Quarkus вы можете настроить ObjectMapper с помощью ObjectMapperCustomizer, как описано здесь: https://quarkus.io/guides/rest-json#jackson

При этом я советую действительно использовать UTF-8 (или UTF-16/UTF-32, если вам нужны расширенные кодировки), поскольку это стандартно для веб-сервисов.

person loicmathieu    schedule 19.05.2020
comment
Спасибо за пояснение, я не знал об этой информации. У нас есть базы данных с кодировкой UTF-8 и ISO-8859-1 (устаревшие), но с этой информацией мы изучим план миграции. Мне удалось сериализовать JSONB вместо Джексона. - person Emerson; 20.05.2020

Мне удалось сериализовать, перейдя на JSONB (реализация Eclipse Yasson) и добавив кодировку в заголовок типа мультимедиа.

person Emerson    schedule 20.05.2020