Java liferay spring portal@ResourceMapping可以';t触发不同类型的http方法
我使用Spring、thymeleaf和AngularJS创建了一个liferay portlet应用程序。对于Java liferay spring portal@ResourceMapping可以';t触发不同类型的http方法,java,angularjs,spring,liferay-6,thymeleaf,Java,Angularjs,Spring,Liferay 6,Thymeleaf,我使用Spring、thymeleaf和AngularJS创建了一个liferay portlet应用程序。对于AngularJS和spring之间的通信,我需要创建一些rest调用,这些调用是我使用@ResourceMapping创建的,如下所示。应用程序工作正常,但问题是我不知道如何进行GET,DELETE,PUThttpREST调用,因为@ResourceMapping不允许指定任何方法 @ResourceMapping(value="getUserDetail") public void
AngularJS
和spring之间的通信,我需要创建一些rest调用,这些调用是我使用@ResourceMapping
创建的,如下所示。应用程序工作正常,但问题是我不知道如何进行GET
,DELETE
,PUT
httpREST
调用,因为@ResourceMapping
不允许指定任何方法
@ResourceMapping(value="getUserDetail")
public void userDetail(@RequestParam long userId, ResourceResponse response) throws Exception {
Users users = new Users(userId);
// some logic
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
JSON_MAPPER.writeValue(response.getPortletOutputStream(), users);
}
当我使用@RequestMapping
而不是@ResourceMapping
时,如下图所示
@RequestMapping(value="getUserDetail", method=RequestMethod.GET)
@ResponseBody
public void userDetail(@RequestParam long userId, ResourceResponse response) throws Exception {
System.out.println("Got detail request for user with id {} "+ userId);
// UserDetail userDetail = this.userService.getPortalUserDetail(userId);
List<String> users = new ArrayList<String>();
users.add("Manu");
users.add("Lissie");
users.add("John");
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
JSON_MAPPER.writeValue(response.getPortletOutputStream(), users);
}
谁能告诉我一些解决方法吗
@ResourceMapping
REST
调用,我们是否可以在Liferay Spring portlet中使用@RequestMapping
而不是@ResourceMapping
REST
url,比如getUser/12/mumbai
REST
json作为主体而不是请求参数发送@RequestMapping
2. Can we use @RequestMapping instead of @ResourceMapping in Liferay Spring portlet for REST calls
你应该能够使用
3. How can we create resource based REST urls like getUser/12/mumbai
@RequestMapping(value="getUser/{userId}/mumbai", method=RequestMethod.GET)
@ResponseBody
public List<String> userDetail(@RequestParam("userId") long userId) throws Exception {
System.out.println("Got detail request for user with id {} "+ userId);
//UserDetail userDetail = this.userService.getPortalUserDetail(userId);
List<String> users = new ArrayList<String>();
users.add("Manu");
users.add("Lissie");
users.add("John");
return users;
}
4. How can we send REST json as body instead of Request Param
You can use @RequestBody
@RequestMapping(value="saveUser/{userId}", method=RequestMethod.GET)
@ResponseStatus(HttpStatus.CREATED)
public void userDetail(@RequestParam("userId") long userId, @RequestBody User user) throws Exception {
// Logic
}
3。我们如何创建基于资源的REST URL,如getUser/12/1
@RequestMapping(value=“getUser/{userId}/mumbai”,method=RequestMethod.GET)
@应答器
公共列表userDetail(@RequestParam(“userId”)long userId)引发异常{
System.out.println(“获取id为{}+userId的用户的详细请求);
//UserDetail UserDetail=this.userService.getPortalUserDetail(userId);
列表用户=新建ArrayList();
用户。添加(“手动”);
用户。添加(“Lissie”);
用户。添加(“John”);
返回用户;
}
4.如何将RESTJSON作为主体而不是请求参数发送
您可以使用@RequestBody
@RequestMapping(value=“saveUser/{userId}”,method=RequestMethod.GET)
@ResponseStatus(HttpStatus.CREATED)
public void userDetail(@RequestParam(“userId”)long userId,@RequestBody User)引发异常{
//逻辑
}
如何使用@ResourceMapping创建不同类型的http调用
以下是一些可能对您有所帮助的示例,这就是我如何使用@RequestMapping
:
// GET
@RequestMapping(value = "/api/something", method = RequestMethod.GET)
@ResponseBody
public boolean getSomething() {
return "something";
}
// GET with param
@RequestMapping(value = "/api/something/{id}", method = RequestMethod.GET)
@ResponseBody
public boolean getSomething(@PathVariable("id") Long id) {
return id;
}
您可以使用RequestMethod.GET
而不是RequestMethod.POST
,RequestMethod.PUT
,RequestMethod.DELETE
等等
如何将RESTJSON作为主体而不是请求参数发送
下面是一段代码片段,我目前使用AngularJS前端进行用户注册。它工作正常,我使用@RequestMapping:
@ResponseBody
@RequestMapping(value = "/auth/register", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<User> register(@RequestBody User user) {
user = userService.initUser(user);
Authentication authentication = securityUserDetailsService.register(user);
if (authentication != null) {
SecurityContext context = SecurityContextHolder.getContext();
context.setAuthentication(authentication);
User authUser = securityUserDetailsService.getAuthenticatedUser();
return new ResponseEntity<>(authUser, HttpStatus.OK);
} else {
return new ResponseEntity<>(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
为了使您能够:
另外,既然你用的是Spring,我想你应该看看和。通过这种方式,您可以将业务模型公开为RESTful端点
我们如何创建基于资源的REST URL,如getUser/12/1
因此,为了公开这个端点getUser/12/mumbai
,您应该这样做:
// mumbai hardcoded
@RequestMapping(value = "/getUser/{id}/mumbai", method = RequestMethod.GET)
@ResponseBody
public User getUser(@PathVariable("id") Long id) {
// go get the user ...
return user;
}
// mumbai as a param
@RequestMapping(value = "/getUser/{id}/{prop}", method = RequestMethod.GET)
@ResponseBody
public User getUser(@PathVariable("id") Long id, @PathVariable("prop") String prop) {
// go get the user ...
return user;
}
最后,你能试着换一下吗
public void userDetail (...
对此
public ResponseEntity<userDetail > (...
公共响应(。。。
模式映射冲突异常
问题没有显示它,但您的控制器可能有@RequestMapping(“视图”)
注释。此类型级别的映射与方法级别的映射冲突。您应该删除控制器类上的@RequestMapping
注释
请求映射示例
@Controller
public class SampleRESTFullController {
// Simple GET
@RequestMapping(value = "/helloSample", method = RequestMethod.GET)
@ResponseStatus(HttpStatus.OK)
public @ResponseBody List<HelloSample> helloSample() { ... }
// GET with path variable
@RequestMapping(value = "/helloSample/sampleId/{sampleId}", method = RequestMethod.GET)
public @ResponseBody HelloSample helloSample(@PathVariable("sampleId") Long sampleId) { ... }
// POST with @RequestBody
@RequestMapping(value = "/helloSample", method = RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
public @ResponseBody HelloSample createSample(@RequestBody HelloSample helloSample) { ... }
// PUT with path variable and @RequestBody
@RequestMapping(value = "/helloSample/sampleId/{sampleId}", method = RequestMethod.PUT)
@ResponseStatus(HttpStatus.NO_CONTENT)
void update(@PathVariable("sampleId") long sampleId, @RequestBody HelloSample helloSample) { ... }
// DELETE
@RequestMapping(value = "/helloSample/sampleId/{sampleId}", method = RequestMethod.DELETE)
@ResponseStatus(HttpStatus.NO_CONTENT)
void delete(@PathVariable("sampleId") long sampleId) { ... }
}
@控制器
公共类采样器控制器{
//简单获得
@RequestMapping(value=“/helloSample”,method=RequestMethod.GET)
@ResponseStatus(HttpStatus.OK)
public@ResponseBody List helloSample(){…}
//获取路径变量
@RequestMapping(value=“/helloSample/sampleId/{sampleId}”,method=RequestMethod.GET)
public@ResponseBody HelloSample HelloSample(@PathVariable(“sampleId”)Long sampleId){…}
//使用@RequestBody发布
@RequestMapping(value=“/helloSample”,method=RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
public@ResponseBody HelloSample createSample(@RequestBody HelloSample HelloSample){…}
//使用路径变量和@RequestBody放置
@RequestMapping(value=“/helloSample/sampleId/{sampleId}”,method=RequestMethod.PUT)
@ResponseStatus(HttpStatus.无内容)
无效更新(@PathVariable(“sampleId”)长sampleId,@RequestBody HelloSample HelloSample){…}
//删除
@RequestMapping(value=“/helloSample/sampleId/{sampleId}”,method=RequestMethod.DELETE)
@ResponseStatus(HttpStatus.无内容)
void delete(@PathVariable(“sampleId”)long sampleId){…}
}
我从博客文章中选取了这些示例。它回答了您所有的问题,并提供了大量示例。请注意Spring配置,它使RESTful服务成为可能(尤其是视图解析器和消息转换器)
有以下方法可以将rest应用程序与angular js一起使用
并使用以下javascript与spring控制器通信
var formData={
“用户名”:“Vasim”,
“密码”:“123456”,
“roleName”:“管理员”
};
var响应=$http.post('add',formData);
response.success(函数(数据、状态、标题、配置){
$scope.message=数据;
});
var formData={
“用户名”:“Vasim”,
“密码”:“123456”,
“roleName”:“管理员”
};
var响应=$http.put('edit',formData);
response.success(函数(数据、状态、标题、配置){
$scope.message=数据;
});
$scope.delete=函数(employeeId){
$http['delete']('delete'{
参数:{
“employeeId”:employeeId
}
}).
成功(功能(数据){
$scope.msg=数据;
});
$http.get('get',{params:{
“id”:id
}
}).成功(功能(数据){
$scope.employees=data;
当我尝试时with@RequestMapping我得到了org.springframework.beans.fac
// mumbai hardcoded
@RequestMapping(value = "/getUser/{id}/mumbai", method = RequestMethod.GET)
@ResponseBody
public User getUser(@PathVariable("id") Long id) {
// go get the user ...
return user;
}
// mumbai as a param
@RequestMapping(value = "/getUser/{id}/{prop}", method = RequestMethod.GET)
@ResponseBody
public User getUser(@PathVariable("id") Long id, @PathVariable("prop") String prop) {
// go get the user ...
return user;
}
public void userDetail (...
public ResponseEntity<userDetail > (...
@Controller
public class SampleRESTFullController {
// Simple GET
@RequestMapping(value = "/helloSample", method = RequestMethod.GET)
@ResponseStatus(HttpStatus.OK)
public @ResponseBody List<HelloSample> helloSample() { ... }
// GET with path variable
@RequestMapping(value = "/helloSample/sampleId/{sampleId}", method = RequestMethod.GET)
public @ResponseBody HelloSample helloSample(@PathVariable("sampleId") Long sampleId) { ... }
// POST with @RequestBody
@RequestMapping(value = "/helloSample", method = RequestMethod.POST)
@ResponseStatus(HttpStatus.CREATED)
public @ResponseBody HelloSample createSample(@RequestBody HelloSample helloSample) { ... }
// PUT with path variable and @RequestBody
@RequestMapping(value = "/helloSample/sampleId/{sampleId}", method = RequestMethod.PUT)
@ResponseStatus(HttpStatus.NO_CONTENT)
void update(@PathVariable("sampleId") long sampleId, @RequestBody HelloSample helloSample) { ... }
// DELETE
@RequestMapping(value = "/helloSample/sampleId/{sampleId}", method = RequestMethod.DELETE)
@ResponseStatus(HttpStatus.NO_CONTENT)
void delete(@PathVariable("sampleId") long sampleId) { ... }
}
@RequestMapping(value = "/saveuser", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
@RequestMapping(value = "/getemployee", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
@RequestMapping(value = "/editCountry", method = RequestMethod.PUT)
@RequestMapping(value = "/deleteCountry", method = RequestMethod.DELETE)