For exercise I'm trying to make a POST call on postman having the following classes but it always gives me an error that it cannot read the data.
The GET give me back the various users in the db and the commented POST where I go to create the new user manually (ie by setting the strings "blabla") works. I would like my POST to take a json object from the postman body
{
"username": "1",
"password": "2",
"email": "3"
}
and sending the request I enter the new user in the db. How can I do?
UserDB.java
public class UserDB {
public void insertUser(User user) {
EntityManager entityManager = JPAUtil.getEntityManagerFactory().createEntityManager();
EntityTransaction entityTransaction = entityManager.getTransaction();
entityTransaction.begin();
user.setUsername(user.getUsername());
user.setPassword(user.getPassword());
user.setEmail(user.getEmail());
entityManager.persist(user);
entityTransaction.commit();
}
User.java
@XmlRootElement(name = "user")
@XmlAccessorType(XmlAccessType.FIELD)
@Entity
@Table(name = "users")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "user_id")
private int user_id;
@Column(name = "username")
private String username;
@Column(name = "password")
private String password;
@Column(name = "email")
private String email;
public User() {
}
public User(int user_id, String username, String password, String email) {
this.user_id = user_id;
this.username = username;
this.password = password;
this.email = email;
}
public User(String username, String password, String email) {
this.username = username;
this.password = password;
this.email = email;
}
public int getUser_id() {
return user_id;
}
public void setUser_id(int user_id) {
this.user_id = user_id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String passoword) {
this.password = passoword;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
RestUser.java
@Path("/users")
public class RestUser {
private UserDB userDB;
public RestUser() {
this.userDB = new UserDB();
}
@GET
@Produces(MediaType.APPLICATION_JSON)
public String getUsers_JSON() {
String listUser = null;
List<User> list = userDB.selectAllUsers();
Gson gson = new Gson();
listUser = gson.toJson(list);
return listUser;
}
@GET
@Path("/{id}")
@Produces(MediaType.APPLICATION_JSON)
public String getUser_byid(@PathParam("id") int id) {
String u = null;
User user = userDB.selectUser_ID(id);
Gson gson = new Gson();
u = gson.toJson(user);
return u;
}
/*
@POST
@Produces(MediaType.APPLICATION_JSON)
public String message() {
String u = null;
Gson gson = new Gson();
User user = new User("user", "sss", "sss");
u = gson.toJson(user);
userDB.insertUser(user);
return u;
}
*/
@POST
@Path("/insert")
@Produces(MediaType.APPLICATION_JSON)
public void createUser(@QueryParam("username") String username,@QueryParam("password") String password,@QueryParam("email") String email) {
User newuser = new User(username, password, email);
userDB.insertUser(newuser);
}
}
I add my pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.exercises</groupId>
<artifactId>UserManagement</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<maven.compiler.target>17</maven.compiler.target>
<maven.compiler.source>17</maven.compiler.source>
</properties>
<dependencies>
<!-- https://mvnrepository.com/artifact/com.googlecode.json-simple/json-simple -->
<dependency>
<groupId>com.googlecode.json-simple</groupId>
<artifactId>json-simple</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.8.9</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-servlet-core</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-client</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.core</groupId>
<artifactId>jersey-server</artifactId>
<version>2.0</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>javax.persistence</artifactId>
<version>2.2.1</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.6.9.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.6.9.Final</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.1</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.3</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.glassfish.web</groupId>
<artifactId>javax.servlet.jsp.jstl</artifactId>
<version>1.2.5</version>
<exclusions>
<exclusion>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
</exclusion>
<exclusion>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<finalName>UserManagement</finalName>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-war-plugin</artifactId>
<version>3.3.2</version>
</plugin>
</plugins>
</build>
</project>
and my web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
id="WebApp_ID" version="3.1">
<servlet>
<servlet-name>jerseyServlet</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
<param-name>jersey.config.server.provider.packages</param-name>
<param-value>net.java.webservice</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jerseyServlet</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
</web-app>
In your controller method createUser
you defined three query parameters for the user attributes instead of using the request body to receive the user data.
If you want to receive the user object as JSON in the request body try this:
@POST
@Path("/insert")
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public void createUser(User user) {
userDB.insertUser(user);
}
Note the @Consumes
annotation. When a HTTP POST request is sent to /users/insert
(you could also leave /insert
out, see below) the createUser
method will be called and the JSON document with the user details will be converted into a Java object of the type User.
You can simplify it to:
@POST
@Consumes(MediaType.APPLICATION_JSON)
@Produces(MediaType.APPLICATION_JSON)
public void createUser(User user) {
userDB.insertUser(user);
}