我目前正在尝试改进Spring Shell应用程序,如果它支持值和选项的tab-completion那么会使其更好的一件事就是。
例如,如果我的CLI有一个命令getInfo --name <name>
,其中<name>
是来自DB中有限名称集的名称,那么能够做到这一点很方便
> getInfo --name Lu<tab>
Lucy Luke Lulu
> getInfo --name Luk<tab>
> getInfo --name Luke
使用现有的Spring Shell工具有没有办法做到这一点?我在文档中发现了一些问题,无法找到有关自动填充值的任何信息。
干杯!
答案 0 :(得分:1)
您可以注册转换器以将此功能转换为String类型。已经有一些已经创建的转换器,org.springframework.shell.converters.EnumConverter具有您正在寻找的功能。
要注册转换器,您需要实现org.springframework.shell.core.Converter接口:
@Component
public class PropertyConverter implements Converter<String> {
public boolean supports(Class<?> type, String optionContext) {
return String.class.isAssignableFrom(type)
&& optionContext != null && optionContext.contains("enable-prop-converter");
}
public String convertFromText(String value, Class<?> targetType, String optionContext) {
return value;
}
public boolean getAllPossibleValues(List<Completion> completions, Class<?> targetType, String existingData,
String optionContext, MethodTarget target) {
boolean result = false;
if (String.class.isAssignableFrom(targetType)) {
String [] values = {"ONE", "BOOKING", "BOOK"};
for (String candidate : values) {
if ("".equals(existingData) || candidate.startsWith(existingData) || existingData.startsWith(candidate)
|| candidate.toUpperCase().startsWith(existingData.toUpperCase())
|| existingData.toUpperCase().startsWith(candidate.toUpperCase())) {
completions.add(new Completion(candidate));
}
}
result = true;
}
return result;
}
}
在前面的例子中,我已经为@CliOption Annotation的optionContext enable-prop-converter
注册了String对象的转换器。
您还必须禁用默认的StringConverter。在下一行中,我使用disable-string-converter
禁用@CliOption批注中的默认String转换器,并使用enable-prop-converter
启用了新的PropertyConverter。
@CliOption(key = { "idProp" }, mandatory = true, help = "The the id of the property", optionContext="disable-string-converter,enable-prop-converter") final String idProp
答案 1 :(得分:1)
对于Spring Shell 2,您需要实现ValueProvider
接口。
import org.springframework.shell.standard.ValueProvider;
@Component
public class MyValueProvider implements ValueProvider {
@Override
public boolean supports(MethodParameter methodParameter, CompletionContext completionContext) {
return true;
}
@Override
public List<CompletionProposal> complete(MethodParameter methodParameter, CompletionContext completionContext, String[] strings) {
List<CompletionProposal> result = new ArrayList();
List<String> knownThings = new ArrayList<>();
knownPaths.add("something");
String userInput = completionContext.currentWordUpToCursor();
knownThings.stream()
.filter(t -> t.startsWith(userInput))
.forEach(t -> result.add(new CompletionProposal(t)));
return result;
}
}