【问题标题】:"Content type 'application/json;charset=UTF-8' not supported" in Spring Rest applicationSpring Rest 应用程序中的“不支持内容类型'application/json;charset=UTF-8'”
【发布时间】:2018-11-06 21:12:12
【问题描述】:

当我在 localhost:8080/api/users 上执行 POST 请求以创建新用户时,我收到以下错误:

{
    "timestamp": "2018-05-28T09:44:55.704+0000",
    "status": 415,
    "error": "Unsupported Media Type",
    "message": "Content type 'application/json;charset=UTF-8' not supported",
    "path": "/api/users/"
}

这是请求的正文,选择了 JSON (application/json)。 即使我删除角色并将其保持为空,它也会给出相同的错误。

头部的内容类型也是application/json。

这是我的控制器:

@PostMapping("/api/users" )
public User createUser(@Valid @RequestBody User user) {
    securityService.autologin(user.getUsername(), user.getPassword());
    return userService.createUser(user);
}

UserService 中的 createUser 函数:

public User createUser(@Valid @RequestBody User user) {
    user.setPassword(bCryptPasswordEncoder.encode(user.getPassword()));
    user.setRoles(new HashSet<>(roleRepository.findAll()));
    return userRepository.save(user);
}

编辑

这是我的用户类:

@Entity
@Table(name = "user")
@EntityListeners(AuditingEntityListener.class)
@JsonIgnoreProperties(value = {"createdAt", "updatedAt"}, 
                      allowGetters = true)
public class User implements Serializable{

    private static final long serialVersionUID = 1L;


    public User() {
        super();
        // TODO Auto-generated constructor stub
    }

    @Id
    @Column(name = "user_id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Column(name = "user_name")
    private String name;

    @Column(name = "user_email")
    private String email;

    @Column(name = "user_password")
    @NotBlank
    private String password;

    @Column(name = "user_status")
    private String status;

    @Column(name = "user_tel")
    private String tel;

    @Column(name = "user_confirmation")
    private String confirmation;

    @Column(name = "user_birth_date")
    @Temporal(TemporalType.DATE)
    private Date birth_date;

    @Column(nullable = false, updatable = false)
    @Temporal(TemporalType.TIMESTAMP)
    @CreatedDate
    private Date createdAt;

    @Column(nullable = false)
    @Temporal(TemporalType.TIMESTAMP)
    @LastModifiedDate
    private Date updatedAt;

    @JsonManagedReference
    @ManyToMany
    @JoinTable(name = "user_role", joinColumns = @JoinColumn(name = "user_id"), inverseJoinColumns = @JoinColumn(name = "role_id"))
    private Set<Role> roles;

    @Column(name = "username")
    @NotBlank
    private String username;

    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;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getTel() {
        return tel;
    }

    public void setTel(String tel) {
        this.tel = tel;
    }

    public String getConfirmation() {
        return confirmation;
    }

    public void setConfirmation(String confirmation) {
        this.confirmation = confirmation;
    }

    public Date getBirth_date() {
        return birth_date;
    }

    public void setBirth_date(Date birth_date) {
        this.birth_date = birth_date;
    }

    public Date getCreatedAt() {
        return createdAt;
    }

    public Date getUpdatedAt() {
        return updatedAt;
    }

    public void setUpdatedAt(Date updatedAt) {
        this.updatedAt = updatedAt;
    }

    public Set<Role> getRoles() {
        return roles;
    }

    public void setRoles(Set<Role> roles) {
        this.roles = roles;
    }
}

【问题讨论】:

  • 你使用的是RestController还是简单的Controller?
  • @Ouissal:参考:stackoverflow.com/a/30424031/4358787 并添加 Content-Type:application/json 并接受:application/json
  • @Ouissal 还要确保你已经在你的实体中放置了 JAXB 注释,即用户类
  • 为什么需要 JAXB 注释来进行 JSON 转换?
  • 您是否为您的应用程序配置了任何 Jackson 或 Gson 转换器?

标签: java spring rest httprequest postman


【解决方案1】:

尝试从 header Content-type 中删除字符集,仅应用程序 json,它可能会起作用。

【讨论】:

    【解决方案2】:

    这篇文章可能为时已晚。

    如果您可以在您的控制器类中为 consumes={MediaType.APPLICATION_JSON_UTF8_VALUE} 添加此媒体类型,则可以通过此操作。

    【讨论】:

      【解决方案3】:

      我在使用 PATCH 请求时也遇到了这个错误:

      public Order markOrderAsPayed(@RequestBody final MultiValueMap<String, String> values) {
      ...
      }
      

      MultiValueMap 来自org.springframework.util。将地图更改为Map&lt;String, String&gt; 为我解决了这个问题。

      抱歉,我无法解释原因。

      【讨论】:

        【解决方案4】:

        Jackson 反序列化时,我也遇到了这个错误作为 WARN。我的情况与来自 Klaudia 的响应更密切相关,在我的 POJO 中有一个成员字段,用于我用@JsonIgnore 标记的服务,但为了简洁起见,我已将我的 getter 和 setter 重命名为 getService() 和 setService()与更长的命名服务接口匹配的变量名称。将@JsonIgnore 添加到不同名称的getter 和setter 解决了错误。

        【讨论】:

          【解决方案5】:

          可能会出现以下情况:有人错误地为同一属性保留了 2 个 getter,而 Jackson 反序列化无法评估。

          它抛出

          Failed to evaluate Jackson deserialization for type [[simple type,
          class com.org..*..*]]:
          com.fasterxml.jackson.databind.exc.InvalidDefinitionException:
          Conflicting getter definitions for property \"field_name\":
          com.org..*..*#getterBName() vs com.org..*..*#gettername()"
          

          在这种情况下,只需删除该字段的额外 getter。

          【讨论】:

            【解决方案6】:

            我能够通过删除 @JsonManagedReference 来解决它。

            【讨论】:

            • 此解决方案适用于我的情况。
            【解决方案7】:

            在我的例子中,Jackson 失败,记录为 WARN:

            Failed to evaluate Jackson deserialization for type [[simple type, class ***]]: com.fasterxml.jackson.databind.JsonMappingException: Conflicting setter definitions for property [...]

            我不小心超载了一个 setter,所以 Jackson 无法解决它,spring 抛出了 415。

            【讨论】:

              【解决方案8】:

              您可以改用“应用程序/json”

              【讨论】:

                【解决方案9】:

                它清楚地说明了不支持的媒体类型,这意味着由于任何问题都无法完成对操作的调用。因此,请检查您的服务操作要求什么,以及您是否正确发送了所有字段。 大多数时候存在映射问题。检查控制台是否有错误。

                【讨论】:

                  【解决方案10】:

                  您指定了 content-type = application/json。我认为您可能还需要检查“接受”标题属性(应用程序/json)

                  【讨论】:

                    【解决方案11】:

                    你可以试试

                    @PostMapping(value="/rest/account/json", consumes={"application/json"})

                    【讨论】:

                    • 我收到此错误:“类型不匹配:无法从 MediaType 转换为 String[]”
                    • @Ouissal:试试这个,MediaType.APPLICATION_JSON_VALUE 而不是 MediaType.APPLICATION_JSON
                    • 显然 OP 得到了一个。现在不同的错误。所以,你的答案可能是正确的。这似乎是现在缺少消息转换器。
                    【解决方案12】:

                    @Produces(MediaType.APPLICATION_JSON) 设置为您的函数以将其设置为json mime 类型。

                    您可以查看that restapi了解更多信息。

                    【讨论】:

                    • 那就是@Consumes(MediaType.APPLICATION_JSON)
                    • "类型不匹配:无法从 MediaType 转换为 String[]"
                    • @Ouissal:试试这个,MediaType.APPLICATION_JSON_VALUE 而不是 MediaType.APPLICATION_JSON
                    • @gaurav 当我更改为该错误时,我收到此错误: BeanCreationException:创建类路径资源中定义的名称为“requestMappingHandlerMapping”的bean时出错...:init方法的调用失败;嵌套异常是 java.lang.IllegalStateException: Invalid mapping on handler class [......UserRestController]...
                    • @Ouissal :你能创建一个最小、完整和可验证的示例吗?把它贴在 github 上,我们可以解决这个问题。仅通过查看异常很难解决新问题。
                    猜你喜欢
                    • 2019-12-16
                    • 1970-01-01
                    • 2018-07-24
                    • 1970-01-01
                    • 2018-08-06
                    • 2015-11-01
                    • 1970-01-01
                    • 2016-12-07
                    • 2013-05-09
                    相关资源
                    最近更新 更多