2017-02-20 5 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

На самом деле вы инстанцирование 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.

+0

Благодарим за ответ. Я изменил код, как вы сказали, но теперь POST дает мне ошибку при попытке добавить нового пользователя. Хорошо, если UserDatabase содержит карту (инициализированную в конструкторе) вместе с полем экземпляра? – Weaveon

+0

Я думаю, вы должны сохранить: private Map users = new HashMap (); –

+0

В чем проблема? –

0

На самом деле вам даже не нужно реализовывать одноэлементный шаблон здесь, если вы используете весеннюю загрузку для разработки своего микросервиса. Вы можете использовать аннотацию @Service на своем классе UserDatabase. Затем в вашем классе UserResource выполните следующие действия.

@Autowired 
UserDatabase usersDatabase = new UserDatabase(); 

Весна будет управлять экземплярами одного экземпляра здесь от имени вас.

Следующие зависимости будут достаточными. Но я считаю, что вы должны создать проект, используя 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

Спасибо, какой jar я должен использовать, чтобы использовать @Autowired аннотацию? – Weaveon

+0

@Weaveon Ответ был обновлен. –

Смежные вопросы