2 回答
TA贡献1875条经验 获得超3个赞
Spring 框架使用基于点的匹配。它从可用的匹配中选择最高的匹配。通过标准越多的人得分越高。如果您在一个匹配中定义了请求的查询参数,那么当参数存在时它将被接受。其他情况另说。
要定义请求的参数,请将它们作为直接属性传递,而不是作为 StrategyFilter 属性传递。在缺少参数的情况下,这样的实例初始化也成功(这些属性不会被初始化,它们保持默认状态:“”/0/false)。所以会出现模棱两可的匹配错误。
最后:使用直接属性而不是 StrategyFilter。
您设计的其他问题是直接 StrategySearchSpecification 实例化。它不是以这种方式进行单元测试的。将其定义为 Spring 组件。
@Component
@Getter // Lombok annotation to generate getter methods
@Setter // Lombok annotation to generate setter methods
public class StrategySearchSpecification
{
private CODE_TYPE code;
private String name;
private TYPE_TYPE type;
}
并将其作为参数注入(正确的实现/模拟)并使用它的设置方法。
@RestController
@RequestMapping("/strategies")
public class StrategyController {
...
@GetMapping
public List<Strategy> getAll() {
return service.getBeans().stream()
.map(mapper::toDto)
.collect(toList());
}
@GetMapping
public List<Strategy> search(@RequestParam CODE_TYPE code, @RequestParam String name, @RequestParam TYPE_TYPE type, StrategySearchSpecification specification ) {
specification.setCode( code );
specification.setName( name );
specification.setType( type );
return service.search( specification
)).stream()
.map(mapper::toDto)
.collect(toList());
}
}
TA贡献1866条经验 获得超5个赞
如果StrategyFilter具有属性nameand type,这应该有效:
@RestController
@RequestMapping("/strategies")
public class StrategyController {
...
@GetMapping
public List<Strategy> getAll() {
return service.getBeans().stream()
.map(mapper::toDto)
.collect(toList());
}
@GetMapping("{name}/{type}")
public List<Strategy> search(StrategyFilter filter) {
return service.search(new StrategySearchSpecification(
filter.getCode(),
filter.getName(),
filter.getType()
)).stream()
.map(mapper::toDto)
.collect(toList());
}
}
添加回答
举报