将包含实体ID的@RequestBody属性转换为Spring中对应的实体

Convert @RequestBody attribute containing entity ID to corresponding entity in Spring

请问,是否可以实现将包含实体ID的请求体属性自动转换为对应的JPA实体?

@Entity
public class Foo {
    @Id
    private Long id;

    // getters and setters
}  

public class Bar {
    private Foo foo;

    // getters and setters
}

@Controller
public class Controller {

    @RequestMapping(path="/foo", method=RequestMethod.POST)
    public void convertFooAction(@RequestBody Bar bar) {
        // variable bar with foo attribute containing entity with corresponding ID
    }
}

示例 JSON 在 POST 请求中使用的请求正文:

{ "foo": 1 }

无论 @RequestBody class 是否为 @Entity,它都应该适用。

感谢任何建议。

我们可以利用@JsonDeserialize 策略来实现它:

定义 BarDeserializer class :

public class BarDeserializer extends JsonDeserializer<Bar> {



    @Override
    public Bar deserialize(JsonParser p, DeserializationContext ctxt) throws IOException, JsonProcessingException {
         JsonNode node = p.getCodec().readTree(p);
            int id = (Integer) ((IntNode) node.get("foo")).numberValue(); 
         Bar bar= new Bar();
         Foo foo=new Foo();
         foo.setId(new Long(id));
         bar.setFoo(foo);
         return bar;
    }



}


@JsonDeserialize(using=BarDeserializer.class)
public class Bar {      

     private Foo foo;

    public Foo getFoo() {
        return foo;
    }

    public void setFoo(Foo foo) {
        this.foo = foo;
    }




}

最后调整 HttpMessageConverters:

 @Configuration
public class WebConfig extends WebMvcConfigurationSupport {

    @Bean
    public MappingJackson2HttpMessageConverter customJackson2HttpMessageConverter() {
        MappingJackson2HttpMessageConverter jsonConverter = new MappingJackson2HttpMessageConverter();
        ObjectMapper objectMapper = new ObjectMapper();
        objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        SimpleModule module = new SimpleModule();
        module.addDeserializer(Bar.class,new BarDeserializer());
        objectMapper.registerModule(module);
        jsonConverter.setObjectMapper(objectMapper);
        return jsonConverter;
    }

    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
        converters.add(customJackson2HttpMessageConverter());

    }
}