为Spring 创建自定义ObjectMapper很容易,但配置需要XML.我正在尝试减少真正不会改变的事情的XML配置量,而无需重新部署我的整个系统.
所以标题说明了一切 - 我可以使用注释或其他非XML方法来告诉Spring,"嘿,请使用我的自定义对象映射器"?
编辑:
这似乎不起作用
@Configuration
@EnableWebMvc
public class AppConfig {
@Primary
@Bean
public ObjectMapper mapper(){
ObjectMapper mapper = new ObjectMapper();
mapper.setPropertyNamingStrategy(PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);
mapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);
mapper.registerModule(new JodaModule());
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
return mapper;
}
}
Run Code Online (Sandbox Code Playgroud)
编辑2: 我不相信Spring正在使用我的 ObjectMapper.我有这个代码:
@Primary
@Bean
public ObjectMapper mapper(){
ObjectMapper mapper = new ObjectMapper();
JodaModule mod = new JodaModule();
mod.addSerializer(DateTime.class, new JsonSerializer<DateTime>() {
@Override
public void serialize(DateTime dateTime, JsonGenerator jsonGenerator, SerializerProvider serializerProvider) throws IOException, JsonProcessingException {
System.out.println("Hi, bob");
}
});
mapper.registerModule(mod);
mapper.setPropertyNamingStrategy(PropertyNamingStrategy.CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES);
mapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);
mapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
mapper.enable(SerializationFeature.INDENT_OUTPUT);
return mapper; …Run Code Online (Sandbox Code Playgroud) Jackson 的 JavaTimeModule可以很好地进行全局序列化/反序列化java.time,但其默认日期时间格式是 ISO 标准,例如2018-01-10T10:20:30LocalDateTime 和2018-01-10T10:20:30+08:00OffsetDateTime。但我需要设置一个全局本地格式,例如2018-01-10 10:20:30LocalDateTime 和 OffsetDateTime,没有TOffsetTime (使用本地默认 OffsetTime)。我怎样才能做到这一点?
注:我知道
@JsonFormat、@JsonSerialize和@JsonDeserialize。这不是全局设置。
使用 Spring Boot 和 Jackson,如何直接在外层将包装/内部列表反序列化为列表?
例如,我有:
{
"transaction": {
"items": {
"item": [
{
"itemNumber": "193487654",
"itemDescription": "Widget",
"itemPrice": "599.00",
"itemQuantity": "1",
"itemBrandName": "ACME",
"itemCategory": "Electronics",
"itemTax": "12.95"
},
{
"itemNumber": "193487654",
"itemDescription": "Widget",
"itemPrice": "599.00",
"itemQuantity": "1",
"itemBrandName": "ACME",
"itemCategory": "Electronics",
"itemTax": "12.95"
}
]
},
...
}
}
Run Code Online (Sandbox Code Playgroud)
在 JSON 下,item是一个列表items;但我想将它解析为一个名为 的列表items,直接位于 之下transaction,而不是定义一个Items包含名为item.
这可能吗?如何定义这个 DTO Item?
public class TrasactionDTO {
private List<Item> items;
...
} …Run Code Online (Sandbox Code Playgroud) Spring Boot 默认允许LocalDate.
例如对于以下 DTO:
public class Person {
private LocalDate birthDate;
//getter & setters
}
Run Code Online (Sandbox Code Playgroud)
以下两种情况都是可以接受的:
{
"birthDate" : "2021-07-24"
}
Run Code Online (Sandbox Code Playgroud)
{
"birthDate" : "2021-07-24T17:00:00Z"
}
Run Code Online (Sandbox Code Playgroud)
Jackson 有一个lenient可以设置为拒绝日期和时间的标志:
@JsonFormat(pattern="uuuu-MM-dd", lenient = OptBoolean.FALSE)
private LocalDate birthDate;
Run Code Online (Sandbox Code Playgroud)
是否有相应的 Spring Boot 应用程序属性标志可以设置为全局应用于所有LocalDate字段,以便不需要将注释添加到每个LocalDate字段,也不需要像这样定义自定义反序列化器?
所以我很难在json中编写我的bean ...首先我尝试使用codehaus'jackson 1.9.13和Spring MVC 3.1.1.我遇到了一些问题,直到我设法达到"直接自我引用"异常.看着这个我发现我需要更快的xml的杰克逊2.然后我发现(这里)我需要Spring 3.1.2因为之前的版本不支持Jackson 2.
所以,毕竟这......我仍然得到同样的例外.我的maven依赖确实包括Spring MVC 3.1.2发行版以及Jackson的2个jar(它们都在我的构建路径中)
<!-- Jackson JSON -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-annotations</artifactId>
<version>2.2.2</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-core</artifactId>
<version>2.2.2</version>
</dependency>
Run Code Online (Sandbox Code Playgroud)
这是我的控制器方法试图发送一个bean:
@RequestMapping(value = "/WS/{id}")
public @ResponseBody Resource displayWS(@PathVariable final int id) {
return this.service.findById(id);
}
Run Code Online (Sandbox Code Playgroud)
这是我在通话后在浏览器中收到的内容:
HTTP Status 406
The resource identified by this request is only capable of generating responses with characteristics not acceptable according to the request "accept" headers ().
Run Code Online (Sandbox Code Playgroud)
这是服务器日志(JBoss 7.1.1):
12:10:59,691 TRACE [org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod] (http-localhost-127.0.0.1-8080-1) Error …Run Code Online (Sandbox Code Playgroud) CurrencyUnit我有一个 pojo,它有一个来自 javamoney 库的类型字段。当我编组这个 pojo 时,杰克逊抛出了一个异常。我记得当我没有定义任何默认构造函数时出现此异常。但在这种情况下,我无法维护该类,CurrencyUnit因为它来自依赖项。我怎样才能继续这项工作?
例外:
com.fasterxml.jackson.databind.exc.InvalidDefinitionException: Cannot construct instance of `javax.money.CurrencyUnit` (no Creators, like default construct, exist): abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information\n at
Run Code Online (Sandbox Code Playgroud) jackson ×6
java ×5
json ×3
spring-boot ×2
date-parsing ×1
java-money ×1
media-type ×1
spring ×1
spring-mvc ×1
web-services ×1