Ouissal
Ouissal

Reputation: 1559

"Content type 'application/json;charset=UTF-8' not supported" in Spring Rest application

When I do a POST request on localhost:8080/api/users to create a new user I get the following error :

{
    "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

Here is the request's body, JSON (application/json) is selected.

It gives the same error even if I remove the Roles and keep it null.

enter image description here

The header's content type is application/json as well.

enter image description here

This is my controller :

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

createUser function in UserService :

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

edit

This is my User class :

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

Upvotes: 34

Views: 182148

Answers (16)

Raveesh Gautam
Raveesh Gautam

Reputation: 1

  "timestamp": "2024-12-13T13:34:15.671+00:00",
    "status": 415,
    "error": "Unsupported Media Type",
    "trace": "org.springframework.web.HttpMediaTypeNotSupportedException: Content-Type 'application/json;charset=UTF-8' is not supported\r\n\tat org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodArgumentResolver.readWithMessageConverters(AbstractMessageConverterMethodArgumentResolver.java:236)\r\n\tat org.springframework.web.

in springboot project this error occured: I am using " @JsonBackReference" it throws the error ,if you remove then ,You will be not getting the error

Upvotes: 0

Halil Ozturk
Halil Ozturk

Reputation: 1

I had similar problem, which caused from the mismatch of JsonBackReference and JsonManagedReference's values. @JsonBackReference(value = "parent - address - reference") vs @JsonManagedReference(value = "parent - address reference")

Upvotes: 0

Leonardo
Leonardo

Reputation: 131

In my case I Had two times the same identifier for jsonProperty in my dto class When I made the request return: "Content type 'application/json;charset=UTF-8" Not sure why return that error but once I changed the identifier it works.

enter image description here

Upvotes: 9

gdthegeek
gdthegeek

Reputation: 376

I had the same issue when using @PutMapping and @RequestBody MultiValueMap<String,String>. I changed the MultiValueMap to Map and it worked, just like what edta had suggested above.

Upvotes: 0

user11150317
user11150317

Reputation:

Try removing charset from header Content-type, application json only, and it will probably work.

Upvotes: 0

gautham
gautham

Reputation: 87

may be too late for this post.

if you can add this media type in your controller class for consumes={MediaType.APPLICATION_JSON_UTF8_VALUE} you can get pass this.

Upvotes: 0

edta
edta

Reputation: 390

I also encounter this error while using following with a PATCH request:

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

The MultiValueMap is from org.springframework.util. Changing the Map to Map<String, String> resolved the problem for me.

Sorry, but I can't give an explanation why.

Upvotes: 0

legistrate
legistrate

Reputation: 41

I was also encountering this Error as WARN with Jackson deserialization. My situation more closely related to the response from Klaudia where I had a member field on my POJO for a Service that I had marked with @JsonIgnore, but I had renamed my getter and setter to getService() and setService() for brevity instead of the variable name which matched a longer named Service Interface. Adding @JsonIgnore to the differently named getter and setter resolved the error.

Upvotes: 2

Pratik Chaudhari
Pratik Chaudhari

Reputation: 87

There can be the case when someone mistakenly keeps 2 getters for the same property and Jackson deserialization fails to evaluate.

It throws

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()"

In that case, just remove the extra getter of that field.

Upvotes: 1

Ouissal
Ouissal

Reputation: 1559

I was able to solve it by removing @JsonManagedReference.

Upvotes: 27

Klaudia
Klaudia

Reputation: 221

In my case there was a Jackson fail, logged as a WARN:

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

I had overloaded a setter by accident, so it could not be resolved by Jackson and spring has thrown 415.

Upvotes: 22

Himadri Mandal
Himadri Mandal

Reputation: 335

You can use "application/json" instead

enter image description here

Upvotes: -1

Chandan Kumar
Chandan Kumar

Reputation: 1246

It clearly says Unsupported Media type which means due to any issue the call to operation cannot be completed. so check what your service operation is asking for and are you sending all the fields correctly. Most of the time there is mapping issue. Check console for errors.

Upvotes: 0

Respect Pub
Respect Pub

Reputation: 25

You specified content-type = application/json. I think you may have to check also "Accept" Header property (application/json)

postman screenshot

Upvotes: 2

Sajan Chandran
Sajan Chandran

Reputation: 11487

You can try something like

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

Upvotes: 2

Tryliom
Tryliom

Reputation: 109

Set @Produces(MediaType.APPLICATION_JSON) to your function to set it in json mime type.

You can check that restapi for more informations.

Upvotes: -1

Related Questions