65

当我尝试使用 post 方法发布新对象时。RequestBody 无法识别 contentType。Spring 已经配置好,POST 可以与其他对象一起使用,但不是这个特定的对象。

org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/json;charset=UTF-8' not supported

如果我尝试相同的请求,只需更改 requestbody 对象。有用。

4

16 回答 16

85

我找到了解决方案。这是因为我有 2 个名称相同但类型不同的二传手。

我的类有id属性 int,当我休眠我的对象时,我用 Integer 替换了它。

但显然,我忘了删除二传手,我有:

/**
 * @param id
 *            the id to set
 */
public void setId(int id) {
    this.id = id;
}

/**
 * @param id
 *            the id to set
 */
public void setId(Integer id) {
    this.id = id;
}

当我删除这个设置器时,rest resquest 工作得很好。

打算抛出解组错误或反映类错误。异常 HttpMediaTypeNotSupportedException 在这里接缝真的很奇怪。

我希望这个stackoverflow可以帮助别人。

边注

您可以检查Spring 服务器控制台以获取以下错误消息:

无法评估类型 [简单类型,类 your.package.ClassName] 的 Jackson 反序列化:com.fasterxml.jackson.databind.JsonMappingException:属性“propertyname”的设置器定义冲突

然后你可以确定你正在处理上面提到的问题。

于 2013-10-18T08:22:01.880 回答
8

还要注意,如果您为未在 POST 中发送的参数属性声明了 getter 和 setter(如果它们未在构造函数中声明,则为事件),例如:

@RestController
public class TestController {

    @RequestMapping(value = "/test", method = RequestMethod.POST)
    public String test(@RequestBody BeanTest beanTest) {
        return "Hello " + beanTest.getName();
    }


    public static class BeanTest {

        private Long id;
        private String name;

        public BeanTest() {
        }

        public BeanTest(Long id) {
            this.id = id;
        }

        public Long getId() {
            return id;
        }

        public void setId(Long id) {
            this.id = id;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }
    }
}

具有下一个结构的发布请求:{"id":"1"} 将不起作用,您必须删除名称获取和设置。

于 2015-12-22T14:06:21.030 回答
5

如果你使用 lombok,如果你搞砸了 @JsonDeserialize 的命名,你会得到这个错误,例如:

@Value
@Builder(toBuilder = true)
@JsonDeserialize(builder = SomeClass.SomeOtherClassBuilder.class)
public class SomeClass {
    ...
    public static class SomeOtherClassBuilder {
        ...
    }
}

它应该是:

@Value
@Builder(toBuilder = true)
@JsonDeserialize(builder = SomeClass.SomeClassBuilder.class)
public class SomeClass {
    ...
    public static class SomeClassBuilder {
        ...
    }
}

当您重构类名并忘记 Builder 时,很容易做到这一点......然后您在寻找错误原因时有很多小时的快乐,而只有极其无用的异常消息作为帮助。

于 2017-05-19T10:22:23.037 回答
4

真的!在花了 4 个小时和疯狂的调试之后,我在 com.fasterxml.jackson.databind.deser.DeserializerCache 发现了这个非常奇怪的代码

if (deser == null) {
    try {
        deser = _createAndCacheValueDeserializer(ctxt, factory, type);
    } catch (Exception e) {
        return false;
    }
}

是的,问题是双传。

于 2014-09-24T08:13:53.580 回答
2

我遇到了同样的问题,我通过反序列化自己的发布值解决了这个问题:

@RequestMapping(value = "/arduinos/commands/{idArduino}", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
@ResponseBody
public String sendCommandesJson(@PathVariable("idArduino") String idArduino, HttpServletRequest request) throws IOException {
    // getting the posted value
    String body = CharStreams.toString(request.getReader());
    List<ArduinoCommand> commandes = new ObjectMapper().readValue(body, new TypeReference<List<ArduinoCommand>>() {
    });

使用这些 gradle 依赖项:

  compile('org.springframework.boot:spring-boot-starter-web')
  compile('com.google.guava:guava:16.0.1')
于 2016-06-16T12:10:10.217 回答
2

在我的情况下,我在 bean 中有两个构造函数,我有同样的错误。我刚刚删除了其中一个,现在问题已解决!

于 2016-06-21T12:06:54.630 回答
2

当我有两个 setter 一个 Enum 和一个 String 时,我遇到了同样的问题。我不得不使用@JsonSetter 注释,它告诉杰克逊在序列化过程中使用什么setter 方法。这解决了我的问题。

于 2016-04-07T21:47:52.057 回答
1

所以我有一个类似的问题,我有一个带有一些重载构造函数的 bean。这个 bean 也有 Optional 属性。

为了解决这个问题,我刚刚删除了重载的构造函数并且它起作用了。

例子:

public class Bean{

Optional<String> string;
Optional<AnotherClass> object;

public Bean(Optional<String> str, Optional<AnotherClass> obj){
string = str;
object = obj;
}

///The problem was below constructor

public Bean(Optional<String> str){
string = str;
object = Optional.empty();
}



}

}
于 2016-10-20T21:55:33.757 回答
1

它看起来是一个旧线程,但如果有人仍然挣扎,我已经解决了 Thibaut 所说的,

避免有两个 setter POJO 类,我有两个用于特定属性的 setter,第一个在常规 setter 中,另一个在构造函数下,在我删除了它工作的构造函数中的一个之后。

于 2018-04-10T14:32:51.777 回答
1

当我将它用作外键时,我遇到了同样的问题。

@JsonBackReference
@ManyToOne(cascade = {CascadeType.PERSIST, CascadeType.DETACH},fetch = FetchType.EAGER)
@JoinColumn(name = "user_id")
private User user;

然后我删除了@JsonBackReference注释。在上述问题得到解决之后。

于 2019-10-21T09:28:56.553 回答
1

对于同一个属性有 2 个 getter 的情况,反序列化器会失败 参考链接

于 2021-01-27T06:45:33.027 回答
1

像这样在实体类构造函数中指定@JsonProperty。

......
......
......

 @JsonCreator
 public Location(@JsonProperty("sl_no") Long sl_no, 
          @JsonProperty("location")String location,
          @JsonProperty("location_type") String 
          location_type,@JsonProperty("store_sl_no")Long store_sl_no) {
  this.sl_no = sl_no;
  this.location = location;
  this.location_type = location_type;
  this.store_sl_no = store_sl_no;
 } 
.......
.......
.......
于 2018-11-12T09:34:46.747 回答
0

尝试添加杰克逊依赖

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-core</artifactId>
        <version>2.9.3</version>
    </dependency>

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-annotations</artifactId>
        <version>2.9.3</version>
    </dependency>

    <dependency>
        <groupId>com.fasterxml.jackson.core</groupId>
        <artifactId>jackson-databind</artifactId>
        <version>2.9.3</version>
        <exclusions>
            <exclusion>
                <artifactId>jackson-annotations</artifactId>
                <groupId>com.fasterxml.jackson.core</groupId>
            </exclusion>
        </exclusions>
    </dependency>
于 2018-02-27T12:45:12.780 回答
0

我在使用 java 9+ 模块时遇到了这个问题。我必须open使用模块才能com.fasterxml.jackson.databind通过反射访问对象。或者,如果您有模型,则只能打开模型所在的包。

于 2019-11-05T13:43:14.797 回答
0

我遇到过同样的问题。根本原因是使用没有默认构造函数的自定义反序列化器。

于 2018-11-19T15:04:34.813 回答
0

在我的例子中,我在控制器中的函数被这样注释:

 @PatchMapping(path = "/{machineGroupName}", consumes = "application/json-patch+json")

一旦我删除了“Consumes”参数,它就起作用了。

于 2021-08-25T13:51:59.380 回答