InvalidDefinitionException:找不到内部类的序列化程序
Posted
技术标签:
【中文标题】InvalidDefinitionException:找不到内部类的序列化程序【英文标题】:InvalidDefinitionException: No serializer found for inner class 【发布时间】:2019-08-04 13:24:18 【问题描述】:我有这门课,我想以JSON
格式返回RestAPI
调用
return ResponseEntity.ok().cacheControl(CacheControl.maxAge(5, TimeUnit.MINUTES))
.body(hotelChart2);
类:
public class HotelChart2
public HotelChart2()
super();
public class Statistics
double min;
double max;
double average;
public Statistics()
super();
public Statistics(double min, double max, double average)
super();
this.min = min;
this.max = max;
this.average = average;
Map<LocalDateTime, DoubleSummaryStatistics> las24HPerHour;
Map<LocalDate, Statistics> last30DPerDay;
Map<LocalDate, Statistics> last3MPerDay;
Map<LocalDate, Statistics> last6MPerDay;
Map<LocalDate, Statistics> last1YPerDay;
public Map<LocalDateTime, DoubleSummaryStatistics> getLas24HPerHour()
return las24HPerHour;
public void setLas24HPerHour(Map<LocalDateTime, DoubleSummaryStatistics> las24hPerHour)
las24HPerHour = las24hPerHour;
public Map<LocalDate, Statistics> getLast30DPerDay()
return last30DPerDay;
public void setLast30DPerDay(Map<LocalDate, Statistics> last30dPerDay)
last30DPerDay = last30dPerDay;
public Map<LocalDate, Statistics> getLast3MPerDay()
return last3MPerDay;
public void setLast3MPerDay(Map<LocalDate, Statistics> last3mPerDay)
last3MPerDay = last3mPerDay;
public Map<LocalDate, Statistics> getLast6MPerDay()
return last6MPerDay;
public void setLast6MPerDay(Map<LocalDate, Statistics> last6mPerDay)
last6MPerDay = last6mPerDay;
public Map<LocalDate, Statistics> getLast1YPerDay()
return last1YPerDay;
public void setLast1YPerDay(Map<LocalDate, Statistics> last1yPerDay)
last1YPerDay = last1yPerDay;
但我收到了这个错误:
Type definition error: [simple type, class com.tdk.api.json.HotelChart2$Statistics]; nested exception is com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class com.tdk.api.json.HotelChart2$Statistics and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS) (through reference chain: com.tdk.api.json.HotelChart2["last3MPerDay"]->java.util.HashMap["2019-01-27"])
at org.springframework.http.converter.json.AbstractJackson2HttpMessageConverter.writeInternal(AbstractJackson2HttpMessageConverter.java:293)
at org.springframework.http.converter.AbstractGenericHttpMessageConverter.write(AbstractGenericHttpMessageConverter.java:103)
at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters(AbstractMessageConverterMethodProcessor.java:290)
【问题讨论】:
【参考方案1】:这两种解决方案中的任何一种都有效!
公开所有成员(默认情况下,Jackson 在公共成员字段上工作)
public double min; //note: members are made public
public double max;
public double average;
public Map<LocalDateTime, DoubleSummaryStatistics> las24HPerHour;
// ..... modify all map as public
如果要修改 Jackson 默认属性,请修改 ObjectMapper
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setVisibility(mapper.getVisibilityChecker()
.withFieldVisibility(JsonAutoDetect.Visibility.ANY));
【讨论】:
【参考方案2】:您需要将getters
添加到您的内部Statistics
类(首选)或在ObjectMapper
级别启用fields
可见性:
ObjectMapper mapper = new ObjectMapper();
mapper.setVisibility(mapper.getVisibilityChecker()
.withFieldVisibility(JsonAutoDetect.Visibility.ANY));
【讨论】:
以上是关于InvalidDefinitionException:找不到内部类的序列化程序的主要内容,如果未能解决你的问题,请参考以下文章