Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

"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

The 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;     } } 
like image 218
Ouissal Benameur Avatar asked May 28 '18 09:05

Ouissal Benameur


People also ask

How to use springmvc @requestbody with JSON?

Please check the above contentType, if you want to use springmvc @RequestBody do submit JSON, type needs to be "application/json;charset=UTF-8", otherwise "not supported" exception would throw. This is easy to do, add the coordinates of Maven or gradle, as follows:

How do I set content type in Spring MVC?

This article explains how to set content type in Spring MVC, first adding Json mapper in the classpath, then using ResponseEntity, and finally changing the return type from String to Map. As always, all the code snippets can be found over on GitHub.

How do I set the content type of a JSON response?

Let's verify the response's content type with a test case: 3.3. Using Map<String, Object> Return Type Last but not the least, we can also set the content type by changing the return type from String to Map. This Map return type will need marshaling and returns JSON object. Here's our new endpoint: Let's see this in action:

Does Jackson serialize snsmessage with content-type JSON header?

When I send request with Content-Type: application/json header manually and with JSON String, SNSMessage is serialized successfully by Jackson. When I change the header to text/plain, I get org.springframework.web.HttpMediaTypeNotSupportedException exception.


1 Answers

I was able to solve it by removing @JsonManagedReference.

like image 62
Ouissal Benameur Avatar answered Oct 05 '22 23:10

Ouissal Benameur