将包含实体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());
}
}
请问,是否可以实现将包含实体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());
}
}