代码之家  ›  专栏  ›  技术社区  ›  ivan

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

  •  0
  • ivan  · 技术社区  · 7 年前

    @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
        }
    }
    

    POST请求中使用的JSON请求体示例:

    { "foo": 1 }
    

    @RequestBody 班级是 @Entity 或者不是。

    谢谢你的建议。

    1 回复  |  直到 7 年前
        1
  •  0
  •   Barath    7 年前

    我们可以使用@JsonDeserialize策略来实现它,如下所示:

    定义BarDeserializer类:

    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;
        }
    
    
    
    
    }
    

     @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());
    
        }
    }