我正在尝试开发一个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请求时,我刚刚添加的用户不存在,我无法理解为什么这发生了。
答案 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>