2 回答

TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超3個(gè)贊
Spring 框架使用基于點(diǎn)的匹配。它從可用的匹配中選擇最高的匹配。通過標(biāo)準(zhǔn)越多的人得分越高。如果您在一個(gè)匹配中定義了請(qǐng)求的查詢參數(shù),那么當(dāng)參數(shù)存在時(shí)它將被接受。其他情況另說。
要定義請(qǐng)求的參數(shù),請(qǐng)將它們作為直接屬性傳遞,而不是作為 StrategyFilter 屬性傳遞。在缺少參數(shù)的情況下,這樣的實(shí)例初始化也成功(這些屬性不會(huì)被初始化,它們保持默認(rèn)狀態(tài):“”/0/false)。所以會(huì)出現(xiàn)模棱兩可的匹配錯(cuò)誤。
最后:使用直接屬性而不是 StrategyFilter。
您設(shè)計(jì)的其他問題是直接 StrategySearchSpecification 實(shí)例化。它不是以這種方式進(jìn)行單元測(cè)試的。將其定義為 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;
}
并將其作為參數(shù)注入(正確的實(shí)現(xiàn)/模擬)并使用它的設(shè)置方法。
@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貢獻(xiàn)1866條經(jīng)驗(yàn) 獲得超5個(gè)贊
如果StrategyFilter具有屬性nameand type,這應(yīng)該有效:
@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());
}
}
添加回答
舉報(bào)