Как я могу определить чат для сериализации в Quarkus?
Я пытаюсь отправить в другую систему через данные RESTCLIENT, которые находятся в кодировке ISO-8859-1, но у меня есть ошибка: "com.fasterxml.jackson.databind.JsonMappingException: Invalid UTF-8 middle byte 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)
2 ответа
Мне удалось сериализовать, перейдя на JSONB (реализация Eclipse Yasson) и добавив кодировку в заголовок типа мультимедиа.
JSON должен быть закодирован в UTF-8, UTF-16 или UTF-32, см. https://tools.ietf.org/html/rfc7159
Джексон автоматически определяет, какой вариант UTF он должен поддерживать. Как объясняется в этом ответе SO, вы можете переопределить этот механизм, предоставивJsonGenerator
к ObjectMapper
: Джексон ObjectMapper с кодировкой UTF-8?
В Quarkus вы можете настроить ObjectMapper
через ObjectMapperCustomizer
как описано здесь: https://quarkus.io/guides/rest-json
При этом я действительно советую использовать UTF-8 (или UTF-16/UTF-32, если вам нужны расширенные кодировки) как стандарт для веб-сервисов.