2017-02-20 99 views
0

我正在尝试开发一个允许客户端将用户添加到数据库的RESTful应用程序。这是用户级POST不会在Java中创建对象

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("https://stackoverflow.com/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请求获取它时,我刚添加的用户不存在,我无法理解为什么会发生这种情况。

回答

0

其实你正在实例化userDatabasesnew 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

+0

谢谢你的回复。我按照你的说法修改了代码,但是现在当试图添加新用户时,POST会给我一个错误。如果UserDatabase包含地图(在构造函数中初始化)以及实例字段,那很好吗? – Weaveon

+0

我认为你必须保持:private Map users = new HashMap (); –

+0

你有什么问题? –

0

实际上,如果你使用spring boot来开发你的微服务,你甚至不需要在这里实现singleton模式。您可以在您的UserDatabase课程上使用@Service注释。然后在你的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> 
+0

谢谢,我一定要使用可以使用@Autowired注解哪个罐子? – Weaveon

+0

@Weaveon答案已更新。 –