我有一个基本的rest控制器,可以获取参数。
如果查询字符串包含我没有定义的参数,我如何拒绝连接?
@RestController
@RequestMapping("/")
public class MyRest {
@RequestMapping(value = "/{id}", method = RequestMethod.GET)
@ResponseBody
public String content(@PathVariable id, @RequestParam(value = "page", required = false) int page) {
return id;
}
}
localhost:8080/myapp/123?Paggge=1
当前,在调用此url时,只使用id执行该方法,而忽略未知的pagge
参数。一般来说,这很好,但我如何验证它们,以防返回HTTP状态码?
在您的控制器方法中,您可以包含一个类型为@recestParam Map的参数
@RestController
@ExposesResourceFor(Widget.class)
@RequestMapping("/widgets")
public class WidgetController {
@Autowired
ArgsChecker<Widget> widgetArgsChecker;
@RequestMapping(value = "", method = RequestMethod.GET, produces = {"application/hal+json"})
public HttpEntity<PagedResources<WidgetResource>> findAll(@RequestParam @ApiIgnore Map<String, String> allRequestParams, Pageable pageable, PagedResourcesAssembler pageAssembler) {
Set<String> invalidArgs = widgetArgsChecker.getInvalidArgs(allRequestParams.keySet());
if (invalidArgs.size() > 0) {
throw new QueryParameterNotSupportedException("The user supplied query parameter(s) that are not supported: " + invalidArgs + " . See below for a list of query paramters that are supported by the widget endpoint.", invalidArgs, widgetArgsChecker.getValidArgs());
}
ArgsChecker可以定义如下:
import com.widgetstore.api.annotation.Queryable;
import lombok.Getter;
import org.apache.commons.lang3.reflect.FieldUtils;
import java.lang.reflect.Field;
import java.util.HashSet;
import java.util.Set;
import java.util.stream.Collectors;
public class ArgsChecker<T> {
@Getter
private Set<String> validArgs;
private ArgsChecker(){};
public ArgsChecker(Class<T> someEntityClass){
validArgs= FieldUtils.getFieldsListWithAnnotation(someEntityClass,Queryable.class)
.stream()
.map(Field::getName)
.collect(Collectors.toSet());
validArgs.add("page");
validArgs.add("size");
}
public Set<String> getInvalidArgs(final Set<String> args){
Set<String> invalidArgs=new HashSet<>(args);
invalidArgs.removeAll(validArgs);
return invalidArgs;
}
}
,它使用反射来查找用“@Queryable”注释注释的字段:
package com.widgetstore.api.annotation;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface Queryable {
}
现在标记域类的字段,您希望使用该注释查询这些字段:
@Getter
@Setter
public class Widget {
@Queryable
private String productGuid;
@Queryable
private String serialNumber;
private String manufacturer;
现在确保在应用程序启动时创建ArgsChecker bean:
@SpringBootApplication
public class StartWidgetApi{
public static void main(String[] args){
SpringApplication.run(StartWidgetApi.class);
}
@Bean(name="widgetArgsChecker")
public ArgsChecker<Widget> widgetArgsChecker(){
return new ArgsChecker<Widget>(Widget.class);
}
//Other ArgsCheckers of different types may be used by other controllers.
@Bean(name="fooArgsChecker")
public ArgsChecker<Foo> fooArgsChecker(){
return new ArgsChecker<Foo>(Foo.class);
}
}
最后,
定义@ControllerAdvice类,该类将侦听应用程序引发的异常:
package com.widgetstore.api.exception;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
@ControllerAdvice
@RequestMapping(produces = "application/json")
@ResponseBody
public class RestControllerAdvice {
@ExceptionHandler(QueryParameterNotSupportedException.class)
public ResponseEntity<Map<String,Object>> unrecogonizedParameter(final QueryParameterNotSupportedException e){
Map<String,Object> errorInfo = new LinkedHashMap<>();
errorInfo.put("timestamp",new Date());
errorInfo.put("errorMessage",e.getMessage());
errorInfo.put("allowableParameters",e.getValidArgs());
return new ResponseEntity<Map<String, Object>>(errorInfo,HttpStatus.BAD_REQUEST);
}
}
,并定义QueryParameterNotSupportedException:
import lombok.Getter;
import java.util.Set;
@Getter
public class QueryParameterNotSupportedException extends RuntimeException{
private Set<String> invalidArgs;
private Set<String> validArgs;
public QueryParameterNotSupportedException(String msg, Set<String> invalidArgs, Set<String> validArgs){
super(msg);
this.invalidArgs=invalidArgs;
this.validArgs=validArgs;
}
}
现在,当用户点击/widget时?未知领域=abc
{"timestamp": 2017-01-10'T'blahblah, "errorMessage": "The user supplied query parameter(s) that are not supported: ["someUnknownField","someOtherField"]. See below for a list of allowed query parameters." ,
"allowableParameters": ["productGuid","serialNumber"]
}
您可能会收到所有参数,并以您想要的方式进行处理。引用spring文档:
在地图上使用@刚体注解时
问题内容: 这是我的简单表格: 这是我的Express.js /Node.js代码: 我试过或或,等等。它们都不起作用。他们都回来了。 当我更改为Get呼叫时,它可以工作,所以..有什么想法吗? 问题答案: 事情已经改变了再次启动 快速4.16.0 ,您现在可以使用与就像在 快车3.0 。 从 Express 4.0到4.15,* 这是不同的: * 然后: 其余的就像在 Express 3.0中一
问题内容: 这是我的简单表格: 这是我的Express.js/Node.js代码: 我尝试过或或,等等。它们都不起作用。他们都回来了。 当我更改为Get呼叫时,它可以工作,所以..有什么想法吗? 问题答案: 事情已经改变了再次启动快速4.16.0,您现在可以使用与就像在快车3.0。 从Express 4.0到4.15,这是不同的: 然后: 其余的就像在Express 3.0中一样 : 首先,您需要
本文向大家介绍Android 检索查询参数,包括了Android 检索查询参数的使用技巧和注意事项,需要的朋友参考一下 示例 如果用户点击一个linkto http://www.example.com/map?param1=FOO¶m2=BAR,那么param1这里将有一个价值"FOO"和param2将有一个价值"BAR"。
我正试图弄清楚如何在OpenAPI中记录我的两个查询参数。 null 键是一个关联数组,可以包含API中的资源名称集合列表。分配给每个筛选项的值是单个id或逗号分隔的id列表。 排序 For排序也遵循JSON:API建议,因此如下所示: null 例如,我不确定是否可以指定过滤器键是一个关联数组,或者它接受逗号分隔的ID列表。对于排序几乎同样的问题:如何表示逗号分隔的排序字段列表?
我正在尝试从一个节点传递一个API,其中字符包含'&'(例如:AT&T),在url查询参数中,我没有得到与AT&T相关联的值,而是它返回的空字符串。有人知道这事吗? http://localhost:3000/account?accountName=AT&T []
问题内容: 我已将Netbeans设置为在我的Java代码中显示未经检查的警告,但是我无法理解以下几行的错误: 给出: 方法来源: 到底出了什么问题,我想如何解决呢?因为我认为在代码中留下未经检查的警告不是一个好主意? 忘了提,但我使用的是Java 7。 编辑 :我现在也看到该方法具有以下内容: 问题答案: 如上面的janoh.janoh所述,Java中的varargs只是数组的语法糖,以及在调用