GVKun编程网logo

在Spring控制器中,能否有一个基于请求参数数量的方法?(spring 控制器 参数解析)

17

本文将分享在Spring控制器中,能否有一个基于请求参数数量的方法?的详细内容,并且还将对spring控制器参数解析进行详尽解释,此外,我们还将为大家带来关于java–如何将整数数组传递给spring

本文将分享在Spring控制器中,能否有一个基于请求参数数量的方法?的详细内容,并且还将对spring 控制器 参数解析进行详尽解释,此外,我们还将为大家带来关于java – 如何将整数数组传递给spring控制器?、java – 用于请求参数的自定义Spring注释、java-使用相同的请求映射重载spring控制器方法、java-在spring控制器中访问当前用户,getAuthentication()返回null的相关知识,希望对你有所帮助。

本文目录一览:

在Spring控制器中,能否有一个基于请求参数数量的方法?(spring 控制器 参数解析)

在Spring控制器中,能否有一个基于请求参数数量的方法?(spring 控制器 参数解析)

我一直在用Spring改造现有的Webapp。显然,从Spring开始比在以后添加要容易。

我们有可以接受多个请求参数的servlet。根据参数的数量,将采取不同的措施。例如,

/doSomething?prod=15

显示产品15的信息,并

/doSomething?prod=15&owner=99

将产品15的所有者设置为99,然后

/doSomething?prod=15&delete=y

删除产品15。

我有一个正在工作的控制器,但是我不知道如何根据参数数量调用不同的方法。例如,这可行(一种简单的方法只是为了确保我掌握了基础知识):

@RequestMapping(method=RequestMethod.GET)public ModelAndView doIt(@RequestParam("prod") int prod, Model model){  ModelAndView mav = new ModelAndView();  mav.setViewName("jsonView");  return mav;}

但不是这个:

@RequestMapping(method=RequestMethod.GET)public ModelAndView doIt(@RequestParam("prod") int prod, Model model){  ModelAndView mav = new ModelAndView();  mav.setViewName("jsonView");  return mav;}@RequestMapping(method=RequestMethod.GET)public ModelAndView doIt(@RequestParam("prod") int prod,                         @RequestParam("owner") int owner,                         Model model){  ModelAndView mav = new ModelAndView();  mav.setViewName("jsonView");  return mav;}

这将引发IllegalStateException,“为HTTP路径’/ mytest’映射的歧义处理程序方法”,然后继续说明:

如果打算使用多种方法处理同一路径,则将它们分解为专用的处理程序类,并在类型级别映射该路径!

我不明白该信息告诉我要做什么。

如果我将方法设置为接受比传入的参数更多或不同的参数,则会得到“客户端发送的请求在语法上不正确()”。

保罗

答案1

小编典典

RequestMapping注释告诉Spring哪些URL请求映射到您的控制器。您可以将值放在方法级别或类级别。

在您的示例中,两个请求映射之间没有什么不同。您可以执行以下操作:

@RequestMapping(value="/bar/example.htm", method={RequestMethod.GET}, params={"prod", "owner"})public String doIt( @RequestParam("prod") int prod,                    @RequestParam("owner") int owner) {    LOGGER.trace("in doIt(int,int)");    return "foo/bar";}@RequestMapping(value="/bar/example.htm", method={RequestMethod.GET}, params={"prod"})public String doIt( @RequestParam("prod") int prod) {    LOGGER.trace("in doIt(int)");    return "foo/bar";}

如果需要,您甚至可以在他们之间共享模型:

@Modelpublic static Map<String,Object> model() {  LOGGER.trace("in model()");  Map<String,Object> model = new HashMap<>();  model.put("hello", "hello world");  return model;}

java – 如何将整数数组传递给spring控制器?

java – 如何将整数数组传递给spring控制器?

脚本数组int和我希望传递给Spring Controller.但我一直在

400 bad request.

如果我的js数组是

array = [1,2,3,4]
array -> 400 bad request
JSON.Stringify(array) -> I will get [1,2,3,4]

    $.ajax({//jquery ajax
                data:{"images": array},                
                dataType:'json',
                type:"post",
                url:"hellomotto"
                ....
            })

当我循环字符串List ..第一个元素将是'[1′

@RequestMapping(value = "/hellomotto", method = Request.POST)
public void hellomotto(@RequestParam("images") List<String> images){
 sysout(images); -> I will get [1,2,3,4]
}

公共无效

我可以知道如何正确地做到这一点?我尝试过不同的组合

解决方法:

以下是一个工作示例:

使用Javascript:

$('#btn_confirm').click(function (e) {

    e.preventDefault();     // do not submit the form

    // prepare the array
    var data = table.rows('.selected').data();
    var ids = [];
    for(var i = 0; i < data.length; i++) { 
        ids.push(Number(data[i][0]));
    }

    $.ajax({
        type: "POST",
        url: "?confirm",
        data: JSON.stringify(ids),
        contentType: "application/json; charset=utf-8",
        dataType: "json",
        success: function(data){
            alert(data);
        },
        failure: function(errMsg) {
            alert(errMsg);
        }
    });
});

控制器:

@RequestMapping(params = "confirm", method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE)
public @ResponseBody int confirm(@RequestBody Long[] ids) {
    // code to handle request
    return ids.length;
}

java – 用于请求参数的自定义Spring注释

java – 用于请求参数的自定义Spring注释

我想编写自定义注释,这将根据注释修改 Spring请求或路径参数.例如代替这段代码:
@RequestMapping(method = RequestMethod.GET)
public String test(@RequestParam("title") String text) {
   text = text.toupperCase();
   System.out.println(text);
   return "form";
}

我可以注释@UpperCase:

@RequestMapping(method = RequestMethod.GET)
   public String test(@RequestParam("title") @UpperCase String text) {
   System.out.println(text);
   return "form";
}

是否可能,如果是,我该怎么办?

解决方法

正如人们在评论中所说的,您可以轻松地编写您的注释驱动的自定义解析器.四个简单的步骤,

>创建一个注释,例如

@Target(ElementType.ParaMETER)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface UpperCase {
    String value();
}

>写一个解析器,例如

public class UpperCaseResolver implements HandlerMethodArgumentResolver {

    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.getParameterannotation(UpperCase.class) != null;
    }

    public Object resolveArgument(MethodParameter parameter,ModelAndViewContainer mavContainer,NativeWebRequest webRequest,WebDataBinderFactory binderFactory) throws Exception {
        UpperCase attr = parameter.getParameterannotation(UpperCase.class);
        return webRequest.getParameter(attr.value()).toupperCase();
    }
}

>注册解析器

<mvc:annotation-driven>
        <mvc:argument-resolvers>
            <bean></bean>
        </mvc:argument-resolvers>
</mvc:annotation-driven>

或java配置

@Configuration
    @EnableWebMvc
    public class Config extends WebMvcConfigurerAdapter {
    ...
      @Override
      public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
          argumentResolvers.add(new UpperCaseResolver());
      }
    ...
    }

>在控制器方法中使用注释,例如

public String test(@UpperCase("foo") String foo)

java-使用相同的请求映射重载spring控制器方法

java-使用相同的请求映射重载spring控制器方法

我有一个session属性:user,我有一个URL,既要由登录用户查看,又要由未以用户身份登录的用户公开查看.

所以我要做的是:

@Controller("myController")
@SessionAttributes({"user"})
public class MyController {

@RequestMapping(value = "/MyPage/{id}",method = RequestMethod.GET)
public ModelAndView getPage(@PathVariable Integer id) {
   return modelandview1;
}

@RequestMapping(value = "/MyPage/{id}",method = RequestMethod.GET)
public ModelAndView getPage(@PathVariable Integer id,@modelattribute User user){
  return modelandview2;
}

但是,我感到它无法正常工作.建议非常欢迎.

最佳答案
我认为@SessionAttributes不是正确的情况.此批注通常用于保留表单支持对象的原始实例,以避免通过隐藏的表单字段传递其状态的无关部分.

您的sceanrio完全不同,因此最好显式使用HttpSession:

@RequestMapping(value = "/MyPage/{id}",HttpSession session) {
    User user = (User) session.getAttribute(...);
    if (user != null) {
        ...
    } else {
        ...
    }
}

还要注意@modelattribute是数据绑定的主体-用户可以通过传递请求参数来更改其字段.在这种情况下,您绝对不想要它.

java-在spring控制器中访问当前用户,getAuthentication()返回null

java-在spring控制器中访问当前用户,getAuthentication()返回null

我试图实施此question.中提供的解决方案

但是,他们都没有为我工作.在我的抽象基本控制器中,我有以下方法(我也使用静态方法在helper类中尝试过,但存在相同的问题):

public User getUser() {
  User user = 
    (User) SecurityContextHolder.getContext().getAuthentication().getPrincipal();       
}

即使在我的jsps中,getAuthentication()返回null,也可以正常工作:

<sec:authentication property="principal.firstname" /> 

因为我的自定义用户对象是可访问的.

为什么getAuthentication返回null?

另外,我尝试将Principal作为参数传递给我的特定控制器方法,这是null也会解析为null …

为什么我的主体为null,但jsp仍在工作?

最佳答案
确保在< intercept-url>中没有过滤器=“ none”.对于控制器的URL,它会禁用Spring Security过滤器,因此不会填充安全上下文.

如果需要使每个人都可以访问控制器,请使用other approaches.

今天的关于在Spring控制器中,能否有一个基于请求参数数量的方法?spring 控制器 参数解析的分享已经结束,谢谢您的关注,如果想了解更多关于java – 如何将整数数组传递给spring控制器?、java – 用于请求参数的自定义Spring注释、java-使用相同的请求映射重载spring控制器方法、java-在spring控制器中访问当前用户,getAuthentication()返回null的相关知识,请在本站进行查询。

本文标签: