34

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;
    }
}
Fopa Léon Constantin
  • 11,863
  • 8
  • 48
  • 82
Ouissal
  • 1,519
  • 2
  • 18
  • 36

14 Answers14

26

I was able to solve it by removing @JsonManagedReference.

Ouissal
  • 1,519
  • 2
  • 18
  • 36
  • 2
    This solution worked in my case. – Anis KCHAOU Oct 14 '21 at 13:54
  • 1
    A bit weird, but it helped - removed @JsonManagedReference from the entity, not involved in this particular place/request/endpoint. The more strange thing is - annotated entity did not cause any issues in other places... – Taraskin Jul 29 '22 at 11:28
20

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.

kadamb
  • 1,532
  • 3
  • 29
  • 55
Klaudia
  • 201
  • 2
  • 2
  • THis helped me solve my issue. I was using @JsonProperty("fooPerson") to try and deserialize the key into something different than the variable name. It wasn't liking that – Brian Akumah Dec 14 '22 at 02:27
2

You can try something like

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

Sajan Chandran
  • 11,287
  • 3
  • 29
  • 38
  • I get this error : "Type mismatch: cannot convert from MediaType to String[]" – Ouissal May 28 '18 at 10:02
  • @Ouissal: Try this once, MediaType.APPLICATION_JSON_VALUE instead of MediaType.APPLICATION_JSON – Gaurav May 28 '18 at 10:07
  • 1
    Clearly the OP is getting a. different error now. So, your answer was probably correct. This seems to be a lack of message converters now. – Edwin Dalorzo May 28 '18 at 10:08
2

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

postman screenshot

Stephen Rauch
  • 47,830
  • 31
  • 106
  • 135
2

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.

legistrate
  • 41
  • 2
1

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.

Martin Brisiak
  • 3,872
  • 12
  • 37
  • 51
1

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

Leonardo
  • 31
  • 3
0

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.

Chandan Kumar
  • 1,066
  • 10
  • 16
0

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.

edta
  • 380
  • 2
  • 6
0

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.

gautham
  • 87
  • 2
  • 12
0

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

0

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.

Md. Nashir Uddin
  • 730
  • 7
  • 20
gdthegeek
  • 11
  • 1
-1

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

You can check that restapi for more informations.

Tryliom
  • 111
  • 1
  • 17
  • 1
    That would be @Consumes(MediaType.APPLICATION_JSON) – kumesana May 28 '18 at 10:00
  • "Type mismatch: cannot convert from MediaType to String[]" – Ouissal May 28 '18 at 10:00
  • @Ouissal: Try this once, MediaType.APPLICATION_JSON_VALUE instead of MediaType.APPLICATION_JSON – Gaurav May 28 '18 at 10:07
  • @gaurav When I change to that I get this error : BeanCreationException: Error creating bean with name 'requestMappingHandlerMapping' defined in class path resource ...: Invocation of init method failed; nested exception is java.lang.IllegalStateException: Invalid mapping on handler class [......UserRestController]... – Ouissal May 28 '18 at 12:00
  • caused by this "Invalid mime type "MediaType.APPLICATION_JSON_VALUE": does not contain '/'" – Ouissal May 28 '18 at 12:08
  • 1
    @Ouissal : Can you create a Minimal, Complete, and Verifiable example? Post it on github and we can fix the issue. Its hard to solve new issues just by looking at the Exceptions. – Gaurav May 28 '18 at 12:12
-1

You can use "application/json" instead

enter image description here

Himadri Mandal
  • 325
  • 2
  • 11