Весенняя загрузка Gson кастомная сериализация - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь перевести сериализацию JSON в моем приложении загрузки с помощью спринта с Джексона по умолчанию на Gson. Я добавил управляемую зависимость в свойствах pom. xml и ниже в application.properties

spring.http.converters.preferred-json-mapper=gson
spring.gson.enable-complex-map-key-serialization=true

POJO, который сериализуется, имеет поле BigDecimal, которое вызывает ошибку ниже. Как правильно предоставить тип адаптера.

Caused by: java.lang.UnsupportedOperationException: Attempted to serialize java.lang.Class: java.math.BigDecimal. Forgot to register a type adapter? at com.google.gson.internal.bind.TypeAdapters$1.write(TypeAdapters.java:73) ~[gson-2.8.5.jar:na] at com.google.gson.internal.bind.TypeAdapters$1.write(TypeAdapters.java:69) ~[gson-2.8.5.jar:na] at com.google.gson.TypeAdapter$1.write(TypeAdapter.java:191) ~[gson-2.8.5.jar:na] at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69) ~[gson-2.8.5.jar:na] at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:127) ~[gson-2.8.5.jar:na] at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:245) ~[gson-2.8.5.jar:na] at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69) ~[gson-2.8.5.jar:na] at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:97) ~[gson-2.8.5.jar:na] at com.google.gson.internal.bind.CollectionTypeAdapterFactory$Adapter.write(CollectionTypeAdapterFactory.java:61) ~[gson-2.8.5.jar:na] at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69) ~[gson-2.8.5.jar:na] at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:127) ~[gson-2.8.5.jar:na] at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:245) ~[gson-2.8.5.jar:na] at com.google.gson.internal.bind.TypeAdapterRuntimeTypeWrapper.write(TypeAdapterRuntimeTypeWrapper.java:69) ~[gson-2.8.5.jar:na] at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$1.write(ReflectiveTypeAdapterFactory.java:127) ~[gson-2.8.5.jar:na] at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.write(ReflectiveTypeAdapterFactory.java:245) ~[gson-2.8.5.jar:na] at com.google.gson.Gson.toJson(Gson.java:704) ~[gson-2.8.5.jar:na] at com.google.gson.Gson.toJson(Gson.java:683) ~[gson-2.8.5.jar:na] at com.google.gson.Gson.toJson(Gson.java:658) ~[gson-2.8.5.jar:na] at org.springframework.http.converter.json.GsonHttpMessageConverter.writeInternal(GsonHttpMessageConverter.java:106) ~[spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE] at org.springframework.http.converter.json.AbstractJsonHttpMessageConverter.writeInternal(AbstractJsonHttpMessageConverter.java:125) ~[spring-web-5.1.8.RELEASE.jar:5.1.8.RELEASE] ... 61 common frames omitted

Ответы [ 2 ]

1 голос
/ 04 марта 2020

Я решил проблему. Кажется, класс «Класс» не поддерживается по умолчанию, поэтому нам нужно зарегистрировать адаптер типа, как показано ниже.

Раствор

@Configuration
@ConditionalOnClass(Gson.class)
public class GsonConfig {
@Bean
public Gson gson() {
    return new GsonBuilder().registerTypeHierarchyAdapter(Class.class, new 
TypeAdapter<Class>() {
        @Override
        public void write(JsonWriter out, Class value) throws IOException {
            out.value(value.getName());
        }

        @Override
        public Class read(JsonReader in) throws IOException {
            try {
                return Class.forName(in.nextString());
            } catch (ClassNotFoundException e) {
                throw new IOException(e);
            }
        }
    }.nullSafe()).create();
   }
  }
0 голосов
/ 04 марта 2020

Ниже приведен метод обработки

@GetMapping(path = "/accounts", produces = "application/json")
public OutputParam getAccount(
        @RequestParam String refNum) {

    return service.getAccount(refNum);
}

И ниже POJO, вызывающего проблему. Он вложен в выходной POJO. Здесь есть класс BigDecimal, который вызывает проблему.

public class Column implements Serializable {
private static final long serialVersionUID = 1L;

private final String code;
private final Class<?> dataType;

public CIMColumn(String code, Class<?> dataType) {
    this.code = code;
    this.dataType = dataType;
}

public String getCode() {
    return code;
}

public Class<?> getType() {
    return dataType;
}

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...