繁体   English   中英

Java Spring 应用程序 - RequestParam 映射为我自己的 object

[英]Java Spring App - RequestParam mapped as my own object

我想要这种链接:

mydom.com/path?param=x& sort=fieldName,false &otherParam=...

我在想 map 排序为一个包含 2 个值的对象(Foo)

public void path(@RequestParam(value = "sort", required = false)Foo sort)

public class Foo{

    private String field;
    private boolean asc;

    //constructor & getters & setters

}

解释:

我想要一个包含精确 2 个值的参数(第一个是排序字段,如果它是升序或降序,则为其他字段。一个字符串和其他 Boolean。

这是可能的,如何?

您可以简单地接受String[] 例如下面:

@GetMapping("/")
public String[] path(@RequestParam("sort") String[] sort) {
    return sort;
}

点击/?sort=abc,def你会得到["abc","def"]作为响应。

或者您可以拆分参数值。 在这两种情况下,您都必须将第二个元素解析为boolean

或者看这个答案

快速而肮脏的方式

class Foo {
    String fieldName;
    Boolean sort;
    @JsonIgnore
    String[] sortParam;
    public void setSortParam(String[] sortParam) throws Exception {
        if(sortParam.length != 2) throw new Exception("");
        this.fieldName = sortParam[0];
        this.sort = Boolean.valueOf(sortParam[1]);
        this.sortParam = sortParam;
    }
    // generate the getters/setters except setSortParam
}

现在您可以使用:

@GetMapping("/")
public Foo something(Foo object) {
    return object;
}

以下解决方案应按您的要求工作:

我想要一个包含精确 2 个值的参数(第一个是排序字段,如果它是升序或降序,则为其他字段。一个字符串和其他 Boolean。

首先实现你的数据持有class,例如Foo:

public class Foo {

   private String field;
   private Boolean asc;

   // add getters/setters 
}

然后实现并配置一个自定义的 Spring `HandlerMethodArgumentResolver' 实现 class:

public class FooParamResolver implements HandlerMethodArgumentResolver {

    @Override
    public boolean supportsParameter(MethodParameter methodParameter) {
        return Foo.class.isAssignableFrom(parameter.getParameterType())
    }

    @Override
    public Object resolveArgument(MethodParameter methodParameter, ModelAndViewContainer modelAndViewContainer, NativeWebRequest nativeWebRequest, WebDataBinderFactory webDataBinderFactory) throws Exception {
        // this is the place where you handle the query params
        // and add them to your Foo instance
        HttpServletRequest request = (HttpServletRequest) nativeWebRequest.getNativeRequest();

        // this is your part ;) 
        String field = // call method to determine field value...
        Boolean asc = // call method to determine asc value
        Foo foo = new Foo();
        foo.setField(field);
        foo.setAsc(asc);
        return foo;
    }
}

最后,注册您的自定义处理程序:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.method.support.HandlerMethodArgumentResolver;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import java.util.List;

@Configuration
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> resolvers) {
        resolvers.add(new FooParamsHandler());
    }
}

现在下面的 controller 方法应该可以完成这项工作:

// don't forget your controller methods annotations, e.g. @GetMapping(path="/yourPath")
public void someMethodName(Foo foo) {
   // do whatever with foo... 
}

好吧,您可以将请求参数排序读取为字符串列表,并使用该列表中的第一个和第二个元素创建您的 object

public void path(@RequestParam(value = "sort", required = false)List<String> sort) {
   Foo sortObj = new Foo(sort.get(0),sort.get(1));
}

你可以参考这个链接 它有两种方式的例子: 1. 发送两个不同的参数 - 字符串和 Boolean 2. 发送 object

https://lankydan.dev/2017/03/11/passing-data-transfer-objects-with-get-in-spring-boot

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM