Spring @RestController自定义JSON反序列化器

jak*_*etr 15 java rest spring jackson spring-boot

我想为某些类使用自定义JSON反序列化器(此处为Role)但我无法使其正常工作.自定义反序列化器不会被调用.

我使用Spring Boot 1.2.

解串器:

public class ModelDeserializer extends JsonDeserializer<Role> {

    @Override
    public Role deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
        return null; // this is what should be called but it isn't
    }
}
Run Code Online (Sandbox Code Playgroud)

控制器:

@RestController
public class RoleController {

    @RequestMapping(value = "/role", method = RequestMethod.POST)
    public Object createRole(Role role) {
        // ... this is called
    }
}
Run Code Online (Sandbox Code Playgroud)
  1. @JsonDeserialize 角色

    @JsonDeserialize(using = ModelDeserializer.class)
    public class Role extends Model {
    
    }
    
    Run Code Online (Sandbox Code Playgroud)
  2. Jackson2ObjectMapperBuilder Java配置中的bean

    @Bean
    public Jackson2ObjectMapperBuilder jacksonBuilder() {
        Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
        builder.deserializerByType(Role.class, new ModelDeserializer());
        return builder;
    }
    
    Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

编辑它可能是@RestController因为它适用于@Controller......

Ily*_*nov 22

首先,您不需要覆盖Jackson2ObjectMapperBuilder以添加自定义反序列化程序.当您无法添加@JsonDeserialize注释时,应使用此方法.你应该使用@JsonDeserialize或覆盖Jackson2ObjectMapperBuilder.

遗漏的是@RequestBody注释:

@RestController
public class JacksonCustomDesRestEndpoint {

    @RequestMapping(value = "/role", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE, produces = MediaType.APPLICATION_JSON_VALUE)
    @ResponseBody
    public Object createRole(@RequestBody Role role) {
        return role;
    }
}

@JsonDeserialize(using = RoleDeserializer.class)
public class Role {
    // ......
}

public class RoleDeserializer extends JsonDeserializer<Role> {
    @Override
    public Role deserialize(JsonParser jp, DeserializationContext ctxt) throws IOException, JsonProcessingException {
        // .................
        return something;
    }
}
Run Code Online (Sandbox Code Playgroud)