Spring@RequestBody REST服务在某个实体关系中发布方法返回415

Spring@RequestBody REST服务在某个实体关系中发布方法返回415,spring,hibernate,jackson,spring-restcontroller,spring-java-config,Spring,Hibernate,Jackson,Spring Restcontroller,Spring Java Config,我在春休冬眠中工作。 我检查了这些链接,但它们没有解决我的问题 还有更多的帖子 当我的实体中存在这种关系时,post和@RequestBody中就没有问题了 University.java public class University extends BaseEntity { private String name; private String address; private String telephon; @OneToMany(fetch =

我在春休冬眠中工作。 我检查了这些链接,但它们没有解决我的问题

还有更多的帖子

当我的实体中存在这种关系时,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
    }
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
}
公共类证书扩展BaseEntity{
私有字符串名称;
@OneToMany(fetch=FetchType.LAZY,mappedBy=“certificate”)
@JsonManagedReference
private List students=new ArrayList();
//二传手
}
在这种类型的关系中,我遇到了415错误。在一些帖子中,建议使用@modeldattribute而不是@RequestBody,这样可以解决错误。但由于帖子的缘故,它说它适合在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);
    }
@RequestMapping(value=“/create3”,method=RequestMethod.POST,consumes={MediaType.APPLICATION\u JSON\u value})
public ResponseEntity create3(@RequestBody大学模型)引发异常{
返回新的ResponseEntity(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();
}



}
@配置
@启用事务管理
@EnableWebMvc
公共类moduleConfig扩展WebMVCConfigureAdapter{
@豆子
公共对象映射器对象映射器(){
ObjectMapper mapper=新的ObjectMapper();
Hibernate5模块=新的Hibernate5模块();
module.configure(Hibernate5Module.Feature.FORCE\u LAZY\u加载,false);
映射器注册表模块(模块);
//其他一些配置。。。。
返回映射器;
}
@凌驾
public void configureMessageConverters(列表>转换器){
用于(HttpMessageConverter转换器:转换器){
if(AbstractJackson2HttpMessageConverter的转换器实例){
AbstractJackson2HttpMessageConverter c=(AbstractJackson2HttpMessageConverter)转换器;
ObjectMapper ObjectMapper=c.getObjectMapper();
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
}
}
超级扩展消息转换器(转换器);
}
@豆子
公共映射jackson2HttpMessageConverter jackson2HttpMessageConverter(){
MappingJackson2HttpMessageConverter=新的MappingJackson2HttpMessageConverter();
setObjectMapper(this.jacksonBuilder().build());
回流转换器;
}
公共Jackson2ObjectMapperBuilder jacksonBuilder(){
Jackson2ObjectMapperBuilder=新Jackson2ObjectMapperBuilder();
Hibernate5Module hibernateModule=新的Hibernate5Module();
hibernateModule.configure(Hibernate5Module.Feature.FORCE_LAZY_LOADING,false);
builder.modules(hibernateModule);
//Spring MVC默认Objectmapper配置
featuresToDisable(反序列化功能。未知属性失败);
builder.featuresToDisable(MapperFeature.DEFAULT\u VIEW\u INCLUSION);
返回生成器;
}
@豆子
公共ViewResolver ViewResolver(){
InternalResourceViewResolver viewResolver=新的InternalResourceViewResolver();
setViewClass(JstlView.class);
setSuffix(“.jsp”);
返回视图解析器;
}
@凌驾
公共无效配置DefaultServletHandling(DefaultServletHandlerConfigurer-configurer){
configurer.enable();
}
}
}

1.实体关系如何导致我的帖子方法出现问题

2.我的代码中缺少什么来正确执行它

感谢您的帮助和建议


Jackson不支持一个实体类上的多个
@JsonBackReference
,除非对它们进行专门命名(每个相关实体都有一个默认名称)

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

@JsonManagedReference(value = "a_name")

@JsonBackReference(value = "a_name")

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

您可以添加JSON发送到服务器吗?服务器是否抛出异常?如果是,也添加它{“name”:“name”,“address”:“address”,“telephon”:“telephon”}我在服务器端添加了postman pictureNo堆栈跟踪?无论如何,Jackson在一个实体上不支持多个@JsonBackReference而不命名它们(我想这就是为什么添加第二个实体时它停止工作的原因)。尝试为每个关系添加一个唯一的名称@Baptiste Beauvais感谢您的宝贵评论,在为每个关系命名后,它都起到了作用。