POST不会在Java中创建对象

时间:2017-02-20 11:26:25

标签: java rest post

我正在尝试开发一个RESTful应用程序,允许客户端将用户添加到数据库中。这是用户类

public class User {

private String id;
private String name;

public User(String id, String name){
    this.id = id;
    this.name = name;
}

//------------Getters and setters-----------------------------------------------------
public String getId(){
    return id;
}

public String getName(){
    return name;
}
}

这是用户数据库类

public class UserDatabase {

private Map<String, String> users = new HashMap<String, String>();

public UserDatabase(){
    users.put("2", "User2");
    users.put("3", "User3");
}

public Map<String, String> getAllUsers(){
    return users;
}

public String getUserName(String id){
    return users.get(id);
}

public void addUser(String id, String name){
    users.put(id, name);
}
}

这是用户资源

@Path("/users")
public class UserResource {

UserDatabase usersDatabase = new UserDatabase();

@GET
@Path("/{id}")
@Produces(MediaType.APPLICATION_JSON)  
public String getUser(@PathParam("id") String id){
    String response = String.valueOf(usersDatabase.getAllUsers().size());
    return response + " " + usersDatabase.getUserName(id);
}

@POST
@Consumes(MediaType.APPLICATION_JSON)
public Response addUser(String userString) throws JSONException { 
    JSONObject user = new JSONObject(userString);
    String userId = user.getString("id");
    String userName = user.getString("name");
    usersDatabase.addUser(userId, userName);
    String result = "Created user with id: " + userId + " and name: " + usersDatabase.getUserName(userId);
    return Response.status(201).entity(result).build(); 
}

}

这是我发出POST请求以添加新用户的客户端,然后是GET请求以获取我刚刚添加的用户

public class TestClient {

private final String baseUrl = "http://localhost:8080/BoardGameManager/rest";

public static void main(String[] args) throws IOException{ 

    TestClient client = new TestClient();       
    client.sendPostRequest("/users");
    client.sendGetRequest("/users/1");
}

private void sendGetRequest(String urlString) throws IOException{

    //Building and sending GET request
    URL url = new URL(baseUrl+ urlString);
    HttpURLConnection connection = (HttpURLConnection)url.openConnection();
    connection.setRequestMethod("GET");
    int responseCode = connection.getResponseCode();  
    System.out.println("Sending get request : "+ url);  
    System.out.println("Response code : "+ responseCode);

    //Reading response from input Stream
    BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));  
    String output;  
    StringBuffer response = new StringBuffer();    
    while ((output = in.readLine()) != null){  
        response.append(output);  
    }  
    in.close();  

    //printing result from response  
    System.out.println(response.toString());
}

private void sendPostRequest(String urlString) throws IOException {  

    //Building POST request
    URL url = new URL(baseUrl + urlString);
    HttpURLConnection connection = (HttpURLConnection)url.openConnection();
    connection.setRequestMethod("POST");
    connection.setRequestProperty("Content-Type","application/json");
    String postData = "{\"id\": \"1\",\"name\": \"User1\"}";

    //Sending POST request
    connection.setDoOutput(true);  
    DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream());
    outputStream.writeBytes(postData);  
    outputStream.flush();  
    outputStream.close();

    //Receiving response
    int responseCode = connection.getResponseCode();  
    System.out.println("\nSending 'POST' request to URL : " + url);  
    System.out.println("Post Data : " + postData);  
    System.out.println("Response Code : " + responseCode);

    BufferedReader in = new BufferedReader(new InputStreamReader(connection.getInputStream()));
    String output;
    StringBuffer response = new StringBuffer();
    while ((output = in.readLine()) != null) {
        response.append(output);
    }
    in.close();

    //printing result from response
    System.out.println(response.toString());

}

}

问题在于,当我发出POST请求时,添加了用户,但是当我尝试使用GET请求时,我刚刚添加的用户不存在,我无法理解为什么这发生了。

2 个答案:

答案 0 :(得分:0)

实际上,您将userDatabases实例化为new UserDatabase(),因此每当您获得userDatabases的新副本时,每次都会获得新的users Map

我建议让您的UserDatabase成为单身人士,以便将每个新添加的用户都保留在地图中:

public class UserDatabase {

    private static UserDatabase instance = null;

    public static UserDatabase getInstance() {
        if(instance == null) {
            instance = new UserDatabase();
        }

        return instance;
    }

    private UserDatabase(){
        users.put("2", "User2");
        users.put("3", "User3");
    }

    //....

}

然后像这样实例化UserDatabase

@Path("/users")
public class UserResource {

    UserDatabase usersDatabase = UserDatabase.getInstance();

}

现在,每次拨打UserDatabase.getInstance()时,您都会获得相同的副本,因此users Map会一样。

答案 1 :(得分:0)

实际上,如果你使用spring boot开发微服务,你甚至不必在这里实现单例模式。您可以在@Service课程中使用UserDatabase注释。然后在UserResource课程中执行以下操作。

@Autowired
UserDatabase usersDatabase = new UserDatabase();

Spring将代表您管理单例实例。

以下依赖就足够了。但我认为您可以根据需要添加依赖项来使用spring initializer创建项目。下面给出的默认依赖关系就足够了,我记得。此外,您可能会找到sample project here

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-test</artifactId>
        <scope>test</scope>
    </dependency>
</dependencies>