Spring Rest应用程序中“内容类型'应用程序/ json; charset = UTF-8'不受支持”

时间:2018-05-28 09:52:36

标签: java spring rest httprequest postman

当我在 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/"
}

enter image description here

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

enter image description here

标题的内容类型也是application / json。

enter image description here

这是我的控制者:

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

我在此处上传https://github.com/Ouissalb/SpringRestApp,它会出现同样的错误

9 个答案:

答案 0 :(得分:6)

在我的情况下,发生了杰克逊失败,并记录为警告:

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

我意外地使塞特犬超载了,所以杰克逊无法解决,斯普林斯抛出了415。

答案 1 :(得分:1)

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

答案 2 :(得分:1)

可能会出现有人错误地为同一属性保留 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。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

您可以尝试类似

的内容

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

答案 5 :(得分:0)

您指定了content-type = application / json。我认为您可能还必须检查“接受”标头属性(application / json)

postman screenshot

答案 6 :(得分:0)

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

答案 7 :(得分:0)

您可以改为使用“ application / json”

enter image description here

答案 8 :(得分:-1)

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

您可以查看that restapi以获取更多信息。