Spring @RequestBody REST 服务 post 方法 return 某些实体关系中的 415
Spring @RequestBody REST services post method return 415 in some entity relation
我正在 spring 休息和休眠。
我检查了 Whosebug 这些链接,但它们没有解决我的问题!
Spring MVC 3.1 REST services post method return 415
等等 post ..
当我在我的实体中有这种关系时,在post和@RequestBody
中没有问题
University.java
public class University extends BaseEntity {
private String name;
private String address;
private String telephon;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "university", cascade = CascadeType.ALL)
@JsonManagedReference
private List<Student> students=new ArrayList<>();
// setter an getter
}
Student.java
public class Student extends BaseEntity{
@Column(name = "FIRST_NAME")
private String firstName;
@Column(name = "LAST_NAME")
private String lastName;
@Column(name = "SECTION")
private String section;
@ManyToOne
@JoinColumn(name = "UNIVERSITY_ID",nullable = false)
@JsonBackReference
private University university;
// setter an getter
}
但是当我将证书实体添加到我的关系时,如下所示
已编辑:
Student.java
public class Student extends BaseEntity{
@Column(name = "FIRST_NAME")
private String firstName;
@Column(name = "LAST_NAME")
private String lastName;
@Column(name = "SECTION")
private String section;
@ManyToOne
@JoinColumn(name = "UNIVERSITY_ID",nullable = false)
@JsonBackReference
private University university;
// added new relation
@ManyToOne
@JoinColumn(name = "certificateid",nullable = false)
@JsonBackReference
private Certificate certificate;
// setter an getter
}
Certificate.java
public class Certificate extends BaseEntity{
private String name;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "certificate")
@JsonManagedReference
private List<Student> students=new ArrayList<>();
// setter an getter
}
在这种类型的关系中,我遇到了 415 错误。在某些post中建议使用@ModelAttribute而不是@RequestBody,它解决了错误。但是由于 post,它说在 MVC 中使用是正确的,而不是在 rest 模板中。
我的控制器 api 是:
@RequestMapping(value = "/create3", method = RequestMethod.POST,consumes = {MediaType.APPLICATION_JSON_VALUE})
public ResponseEntity<University> create3( @RequestBody University model) throws Exception {
return new ResponseEntity<University>(this.universityService.add(model), HttpStatus.OK);
}
和我的配置 class
@Configuration
@EnableTransactionManagement
@EnableWebMvc
public class moduleConfig extends WebMvcConfigurerAdapter {
@Bean
public ObjectMapper objectMapper(){
ObjectMapper mapper = new ObjectMapper();
Hibernate5Module module = new Hibernate5Module();
module.configure(Hibernate5Module.Feature.FORCE_LAZY_LOADING, false);
mapper.registerModule(module);
//Some other configuration....
return mapper;
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(new MappingJackson2HttpMessageConverter());
super.configureMessageConverters(converters);
}
//configure the output json format
//
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
for (HttpMessageConverter<?> converter : converters) {
if (converter instanceof AbstractJackson2HttpMessageConverter) {
AbstractJackson2HttpMessageConverter c = (AbstractJackson2HttpMessageConverter) converter;
ObjectMapper objectMapper = c.getObjectMapper();
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
}
}
super.extendMessageConverters(converters);
}
@Bean
public MappingJackson2HttpMessageConverter jackson2HttpMessageConverter() {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setObjectMapper(this.jacksonBuilder().build());
return converter;
}
public Jackson2ObjectMapperBuilder jacksonBuilder() {
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
Hibernate5Module hibernateModule = new Hibernate5Module();
hibernateModule.configure(Hibernate5Module.Feature.FORCE_LAZY_LOADING, false);
builder.modules(hibernateModule);
// Spring MVC default Objectmapper configuration
builder.featuresToDisable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
builder.featuresToDisable(MapperFeature.DEFAULT_VIEW_INCLUSION);
return builder;
}
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setViewClass(JstlView.class);
viewResolver.setSuffix(".jsp");
return viewResolver;
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
}
1.How 实体关系导致我的 post 方法出现问题?
2.what 我的代码中缺少正确的代码吗?
感谢任何帮助和想法。
Jackson 不支持在一个实体 class 上使用多个 @JsonBackReference
而不具体命名它们(每个关联都有一个默认名称)。
为每个关系设置一个特定的名称,例如:
@JsonManagedReference(value = "a_name")
@JsonBackReference(value = "a_name")
问题来自 JSON(以及任何面向文档的数据)的格式,该格式不允许一个节点有多个父节点。
我正在 spring 休息和休眠。 我检查了 Whosebug 这些链接,但它们没有解决我的问题!
Spring MVC 3.1 REST services post method return 415
等等 post ..
当我在我的实体中有这种关系时,在post和@RequestBody
中没有问题University.java
public class University extends BaseEntity {
private String name;
private String address;
private String telephon;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "university", cascade = CascadeType.ALL)
@JsonManagedReference
private List<Student> students=new ArrayList<>();
// setter an getter
}
Student.java
public class Student extends BaseEntity{
@Column(name = "FIRST_NAME")
private String firstName;
@Column(name = "LAST_NAME")
private String lastName;
@Column(name = "SECTION")
private String section;
@ManyToOne
@JoinColumn(name = "UNIVERSITY_ID",nullable = false)
@JsonBackReference
private University university;
// setter an getter
}
但是当我将证书实体添加到我的关系时,如下所示
已编辑:
Student.java
public class Student extends BaseEntity{
@Column(name = "FIRST_NAME")
private String firstName;
@Column(name = "LAST_NAME")
private String lastName;
@Column(name = "SECTION")
private String section;
@ManyToOne
@JoinColumn(name = "UNIVERSITY_ID",nullable = false)
@JsonBackReference
private University university;
// added new relation
@ManyToOne
@JoinColumn(name = "certificateid",nullable = false)
@JsonBackReference
private Certificate certificate;
// setter an getter
}
Certificate.java
public class Certificate extends BaseEntity{
private String name;
@OneToMany(fetch = FetchType.LAZY, mappedBy = "certificate")
@JsonManagedReference
private List<Student> students=new ArrayList<>();
// setter an getter
}
在这种类型的关系中,我遇到了 415 错误。在某些post中建议使用@ModelAttribute而不是@RequestBody,它解决了错误。但是由于
我的控制器 api 是:
@RequestMapping(value = "/create3", method = RequestMethod.POST,consumes = {MediaType.APPLICATION_JSON_VALUE})
public ResponseEntity<University> create3( @RequestBody University model) throws Exception {
return new ResponseEntity<University>(this.universityService.add(model), HttpStatus.OK);
}
和我的配置 class
@Configuration
@EnableTransactionManagement
@EnableWebMvc
public class moduleConfig extends WebMvcConfigurerAdapter {
@Bean
public ObjectMapper objectMapper(){
ObjectMapper mapper = new ObjectMapper();
Hibernate5Module module = new Hibernate5Module();
module.configure(Hibernate5Module.Feature.FORCE_LAZY_LOADING, false);
mapper.registerModule(module);
//Some other configuration....
return mapper;
}
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
converters.add(new MappingJackson2HttpMessageConverter());
super.configureMessageConverters(converters);
}
//configure the output json format
//
@Override
public void extendMessageConverters(List<HttpMessageConverter<?>> converters) {
for (HttpMessageConverter<?> converter : converters) {
if (converter instanceof AbstractJackson2HttpMessageConverter) {
AbstractJackson2HttpMessageConverter c = (AbstractJackson2HttpMessageConverter) converter;
ObjectMapper objectMapper = c.getObjectMapper();
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
}
}
super.extendMessageConverters(converters);
}
@Bean
public MappingJackson2HttpMessageConverter jackson2HttpMessageConverter() {
MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
converter.setObjectMapper(this.jacksonBuilder().build());
return converter;
}
public Jackson2ObjectMapperBuilder jacksonBuilder() {
Jackson2ObjectMapperBuilder builder = new Jackson2ObjectMapperBuilder();
Hibernate5Module hibernateModule = new Hibernate5Module();
hibernateModule.configure(Hibernate5Module.Feature.FORCE_LAZY_LOADING, false);
builder.modules(hibernateModule);
// Spring MVC default Objectmapper configuration
builder.featuresToDisable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
builder.featuresToDisable(MapperFeature.DEFAULT_VIEW_INCLUSION);
return builder;
}
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
viewResolver.setViewClass(JstlView.class);
viewResolver.setSuffix(".jsp");
return viewResolver;
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
}
}
1.How 实体关系导致我的 post 方法出现问题?
2.what 我的代码中缺少正确的代码吗?
感谢任何帮助和想法。
Jackson 不支持在一个实体 class 上使用多个 @JsonBackReference
而不具体命名它们(每个关联都有一个默认名称)。
为每个关系设置一个特定的名称,例如:
@JsonManagedReference(value = "a_name")
@JsonBackReference(value = "a_name")
问题来自 JSON(以及任何面向文档的数据)的格式,该格式不允许一个节点有多个父节点。