在对象映射器中全局注册模块
register modules in object mapper globally
我的主题 class 有一个数据成员 duration
LocalTime
@Entity
@Table(name= "topics")
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,
property = "id",
scope = Long.class)
@DynamicInsert(true)
@DynamicUpdate(true)
public class Topics implements Serializable {
private static final long serialVersionUID = -1777454701749518940L;
@Id
@Column(name= "id")
private Long id = Long.parseLong(UUID.randomUUID().toString().substring(0, 8), 16);
@NotEmpty
@NotNull
@Column(name= "topic", columnDefinition = "Text", length = 50000)
private String topic;
@Convert(converter = LocalTimeConverter.class)
private LocalTime duration;
// getters and setters
}
输入json:
{
"topic":"x111",
"imageUrl":"http://x.com/x1/x11/x111",
"duration":"00:00:05"
}
错误:
Can not construct instance of java.time.LocalTime: no String-argument constructor/factory method to deserialize from String value ('00:00:05')
解决方案:
POM.XML
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson</groupId>
<artifactId>jackson-bom</artifactId>
<version>2.9.0</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-parameter-names</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jdk8</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
和
ObjectMapper mapper = new ObjectMapper();
mapper.findAndRegisterModules();
or
mapper.registerModule(new ParameterNamesModule())
.registerModule(new Jdk8Module())
.registerModule(new JavaTimeModule());
它工作正常,但我如何才能全局注册模块。
我试过扩展 WebConfigurationAdapter
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
final MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
final ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
objectMapper.registerModule(new ParameterNamesModule())
.registerModule(new Jdk8Module())
.registerModule(new JavaTimeModule());
//objectMapper.findAndRegisterModules();
converter.setObjectMapper(objectMapper);
converters.add(converter);
super.configureMessageConverters(converters);
}
但是没用
只需将这段代码放入您的主 Spring 启动应用程序 class
@Autowired
void configureObjectMapper(final ObjectMapper mapper) {
mapper.registerModule(new ParameterNamesModule())
.registerModule(new Jdk8Module())
.registerModule(new JavaTimeModule());
}
这应该可以解决问题。
您甚至可以使用 @Bean
.
创建一个函数
而不是使用 new
创建 ObjectMapper。在您需要的 class 中自动装配 ObjectMapper。
我的主题 class 有一个数据成员 duration
LocalTime
@Entity
@Table(name= "topics")
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class,
property = "id",
scope = Long.class)
@DynamicInsert(true)
@DynamicUpdate(true)
public class Topics implements Serializable {
private static final long serialVersionUID = -1777454701749518940L;
@Id
@Column(name= "id")
private Long id = Long.parseLong(UUID.randomUUID().toString().substring(0, 8), 16);
@NotEmpty
@NotNull
@Column(name= "topic", columnDefinition = "Text", length = 50000)
private String topic;
@Convert(converter = LocalTimeConverter.class)
private LocalTime duration;
// getters and setters
}
输入json:
{
"topic":"x111",
"imageUrl":"http://x.com/x1/x11/x111",
"duration":"00:00:05"
}
错误:
Can not construct instance of java.time.LocalTime: no String-argument constructor/factory method to deserialize from String value ('00:00:05')
解决方案:
POM.XML
<dependencyManagement>
<dependencies>
<dependency>
<groupId>com.fasterxml.jackson</groupId>
<artifactId>jackson-bom</artifactId>
<version>2.9.0</version>
<scope>import</scope>
<type>pom</type>
</dependency>
</dependencies>
</dependencyManagement>
<dependency>
<groupId>com.fasterxml.jackson.module</groupId>
<artifactId>jackson-module-parameter-names</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jdk8</artifactId>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.datatype</groupId>
<artifactId>jackson-datatype-jsr310</artifactId>
</dependency>
和
ObjectMapper mapper = new ObjectMapper();
mapper.findAndRegisterModules();
or
mapper.registerModule(new ParameterNamesModule())
.registerModule(new Jdk8Module())
.registerModule(new JavaTimeModule());
它工作正常,但我如何才能全局注册模块。
我试过扩展 WebConfigurationAdapter
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
final MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
final ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
objectMapper.registerModule(new ParameterNamesModule())
.registerModule(new Jdk8Module())
.registerModule(new JavaTimeModule());
//objectMapper.findAndRegisterModules();
converter.setObjectMapper(objectMapper);
converters.add(converter);
super.configureMessageConverters(converters);
}
但是没用
只需将这段代码放入您的主 Spring 启动应用程序 class
@Autowired
void configureObjectMapper(final ObjectMapper mapper) {
mapper.registerModule(new ParameterNamesModule())
.registerModule(new Jdk8Module())
.registerModule(new JavaTimeModule());
}
这应该可以解决问题。
您甚至可以使用 @Bean
.
创建一个函数
而不是使用 new
创建 ObjectMapper。在您需要的 class 中自动装配 ObjectMapper。