[英]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.