我正在尝试使用Spring用于后端/ webservice和前端的2个不同项目来开发RESTful Webservice。
在后端项目中,我实现了模型
@Entity
@Table(name="user")
public class User {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "id_user", nullable = false)
private String id;
@Column(name = "username", nullable = false)
private String username;
@Column(name = "firstname", nullable = false)
private String firstname;
@Column(name = "lastname", nullable = false)
private String lastname;
@Column(name = "password", nullable = false)
private String password;
@Column(name = "email", nullable = false)
private String email;
@Column(name = "own_printer", nullable = false)
private Boolean ownsPrinter;
// Getters Setters...
}
还有一个UserDAO类(用于通过Hibernate 4访问数据库)和用于业务流程的UserManager。 然后是一个UserController:
@RestController
public class UserController {
private UserService userService ;
@RequestMapping(value = "/listusers")
List<User> getAllUser() {
Application.context = new ClassPathXmlApplicationContext("applicationContext.xml");
userService = (UserService) Application.context.getBean("userService");
List<User> users = userService.getUsers();
return users;
}
@RequestMapping(value = "/user/{userid}")
User getUserById(@PathVariable("userid") String userId) {
Application.context = new ClassPathXmlApplicationContext("applicationContext.xml");
userService = (UserService) Application.context.getBean("userService");
User user = userService.getUserById(userId);
return user;
}
@RequestMapping(value = "/user/add")
@ResponseBody
User signUpUser(@RequestBody User user ) {
// Don't really know what to do...
userService = (UserService) Application.context.getBean("userService");
return user;
}
}
现在,对于前端项目,我实现了相同的User类。 我写了一个UserDAO UserManager和UserController类:
//UserDAO.java
@Repository("userDAO")
public class UserDAOImpl implements UserDAO{
@Override
public ArrayList<User> getUsers() {
//User[] users = new RestTemplate().getForEntity(WebService.getWebServiceUrl() + "users", User[].class).getBody();
ArrayList<User> user = new RestTemplate().getForEntity(WebService.getWebServiceUrl() + "listusers", ArrayList.class).getBody();
return (user);
//return Arrays.asList(users);
}
@Override
public User getUserById(String userId) {
User user = new RestTemplate().getForEntity(WebService.getWebServiceUrl() + "user/" + userId, User.class).getBody();
return user;
}
@Override
public void insertUser(User user) {
// doesn't work
RestTemplate template = new RestTempl ate();
template.postForObject(WebService.getWebServiceUrl() + "user/add",user, String.class);
System.out.println(user.toString());
}
}
//UserController.java
@Controller
public class UserController {
private static final Logger logger = LoggerFactory.getLogger(UserController.class);
private UserService userService = new UserServiceImpl();
@RequestMapping(value = "/listusers", method = RequestMethod.GET)
public String listUsers(@RequestParam(required=false)Locale locale, Model model) {
logger.info("Users page", locale);
ArrayList<User> users = userService.getUsers();
model.addAttribute("users", users);
return "listusers";
}
@RequestMapping(value = "/user/{user_id}", method = RequestMethod.GET)
public String singleUser(@RequestParam(required=false)Locale locale,
Model model,HttpServletRequest request, @RequestParam String id) {
logger.info("User page", locale);
User user = userService.getUserById(id);
model.addAttribute("user", user);
return "user";
}
@RequestMapping(value = "/signup", method = RequestMethod.GET)
public String listPersons(Model model) {
model.addAttribute("user", new User());
return "signup";
}
//For add and update person both
@RequestMapping(value= "/user/add", method = RequestMethod.POST)
@ResponseBody
public void saveUser(Model model, @ModelAttribute("user") User u){
RestTemplate rt = new RestTemplate();
rt.getMessageConverters().add(new MappingJacksonHttpMessageConverter());
rt.getMessageConverters().add(new StringHttpMessageConverter());
String uri = new String(WebService.getWebServiceUrl() + "user/add");
User user = new User();
user = u;
User returns = rt.postForObject(uri, u, User.class);
}
}
获取请求的工作原理:我可以显示我的用户列表。 但是我的问题是,我无法通过发布请求将数据从前端部分传递到后端Web服务部分...我一直在尝试几种解决方案,但我认为其他地方有些问题。
我对JavaEE应用程序领域有点陌生。 有人可以帮助我或指导我找到解决方案吗?
在前端UserDAO中:
public ArrayList<User> getUsers() {
ArrayList<User> user = new RestTemplate().getForEntity(WebService.getWebServiceUrl() + "listusers", ArrayList.class).getBody();
return (user);
}
此代码允许通过uri“ / listuser”请求服务器。 在frontEnd UserController上,您可以看到调用getUsers()的函数:
@RequestMapping(value = "/listusers", method = RequestMethod.GET)
public String listUsers(@RequestParam(required=false)Locale locale, Model model) {
logger.info("Users page", locale);
ArrayList<User> users = userService.getUsers();
model.addAttribute("users", users);
return "listusers";
}
然后在后端路由此网址的函数:
@RequestMapping(value = "/listusers")
List<User> getAllUser() {
Application.context = new ClassPathXmlApplicationContext("applicationContext.xml");
userService = (UserService) Application.context.getBean("userService");
List<User> users = userService.getUsers();
return users;
}
之后,后端UserDAO类访问数据库。
您可能希望在前端查看发布到的URL。 您使用相同的URL张贴到前端(UserDAO)和后端(UserController):WebService.getWebServiceUrl()
[编辑]您有两个POST服务,例如/ user / add /,如果将它们公开在相同的url上,则发生冲突。 您的后端可能将托管在另一个端口或另一台服务器上。 您应该使用该URL从前端访问后端服务。
[编辑2]是,对于列表用户,您不是从前端进行REST调用。 您正在调用JAVA API userService。 但是对于添加用户,您将再次从前端到后端进行REST调用