gpt4 book ai didi

Spring @RequestBody REST 服务 post 方法在某些实体关系中返回 415

转载 作者:行者123 更新时间:2023-12-05 04:09:17 26 4
gpt4 key购买 nike

我正在使用 spring rest 和 hibernate。我检查了 stackoverflow 这些链接,但它们没有解决我的问题!

Spring MVC 3.1 REST services post method return 415

415 Unsupported MediaType for POST request in spring application

HTTP Status 415 - Unsupported Media Type when doing POST

还有更多帖子..

当我在我的实体中有这种关系时,在post和@RequestBody中没有问题

大学.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
}

学生.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
}

但是当我将证书实体添加到我的关系时,如下所示

编辑:

学生.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
}

证书.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 错误。并且在一些帖子中建议使用@ModelAttribute 而不是@RequestBody,它解决了错误。但由于 this post,它说在 MVC 中使用是正确的,而不是在 rest 模板中使用。

我的 Controller 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);
}

和我的配置类

@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
//https://stackoverflow.com/questions/4823358/spring-configure-responsebody-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.实体关系如何导致我的 post 方法出现问题?

2.我的代码中缺少什么才能正确执行?

感谢任何帮助和想法。

enter image description here

enter image description here

最佳答案

Jackson 不支持在一个实体类上使用多个 @JsonBackReference 而不特别命名它们(每个关联都有一个默认名称)。

为每个关系设置一个特定的名称,例如:

@JsonManagedReference(value = "a_name")

@JsonBackReference(value = "a_name")

问题来自 JSON(以及任何面向文档的数据)的格式,该格式不允许一个节点有多个父节点。

关于Spring @RequestBody REST 服务 post 方法在某些实体关系中返回 415,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46275227/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com