首先我想说我看到了一个网站:
https://cwiki.apache.org/WICKET/autocomplete-using-a-wicket-model.html
我仍然遇到实施问题。
上下文
我有表格想要从我的数据库编辑订单。
我想在表单中自动完成客户端的名称并将其保存到数据库。
问题
我可以看到客户名称的建议,我可以选择我将使用的客户名称。
就在我提交表单时,新客户端将不会按顺序保存在数据库中。
我不知道如何将表单模型与AutoCompleteTextField输入相关联。
有什么想法吗?
我班级的伪代码:
Order{
Long id;
String date;
Client client;
Status status;
...
}
Client{
Long id;
String name;
String nip;
String address;
String postcode;
String city;
String phone;
String mail;
...
}
Status{
Long id;
String name;
String value;
}
编辑:
是的,你是对的。
我在网站上实现AbstractAutoCompleteTextField:
AbstractAutoCompleteRenderer autoCompleteRenderer = new AbstractAutoCompleteRenderer() {
protected final String getTextValue(final Object object) {
Client client = (Client) object;
return client.getName();
}
protected final void renderChoice(final Object object, final Response response, final String criteria) {
response.write(getTextValue(object));
}
};
// textfield
AbstractAutoCompleteTextField<Client> name = new AbstractAutoCompleteTextField<Client>("name", new PropertyModel(order, "client"), autoCompleteRenderer) {
protected final List<Client> getChoiceList(final String input) {
return clientService.findByNames(10, 0, input);
}
protected final String getChoiceValue(final Client choice) throws Throwable {
return choice.getId().toString();
}
};
form.add(name);
我要求的表单实现:
form = new Form("orderForm", new CompoundPropertyModel(order)) {
@Override
public void onSubmit() {
orderService.update((Order) getDefaultModelObject());
setResponsePage(OrdersPage.class);
// Form validation successful. Display message showing edited
// model.
}
};
通过这段代码,我得到了:“'Hurtownia Techniczna”ADA“'不适合客户。” (翻译自波兰语)在反馈小组中。
答案 0 :(得分:3)
我认为,这就是出错的地方:
AbstractAutoCompleteTextField<Client> name = new AbstractAutoCompleteTextField<Client>("name", new PropertyModel(order, "client"), autoCompleteRenderer)
编辑其余部分以反映正确的用例
具体来说:您正在创建订单客户端值的PropertyModel,它是一个Client-Object并将其绑定到TextField。要从TextField创建Client对象,wicket需要一个转换器。有许多内置转换器,但它们都不能转换为自定义对象。因此,您需要通过实现IConverter来提供转换器。由于我不知道您如何存储和检索客户端对象,因此我只能向您展示一个通用示例,即我的一个项目中使用的Locale-Converter:
public class LocaleConverter implements IConverter {
private static final long serialVersionUID = 3251433094703013493L;
/* (non-Javadoc)
* @see org.apache.wicket.util.convert.IConverter#convertToObject(java.lang.String, java.util.Locale)
*/
@Override
public Object convertToObject(String value, Locale locale) {
Locale retValue = null;
try {
retValue = LocaleUtils.toLocale(value);
} catch (IllegalArgumentException e) {
throw (new ConversionException("" + value + " is not a valid locale.", e));
}
return retValue;
}
/* (non-Javadoc)
* @see org.apache.wicket.util.convert.IConverter#convertToString(java.lang.Object, java.util.Locale)
*/
@Override
public String convertToString(Object value, Locale locale) {
return value.toString();
}
}
然后,您需要将新转换器注册到您的应用程序。同样,这对你来说会有所不同,因为你有一个不同的转换器......
@Override
protected IConverterLocator newConverterLocator() {
ConverterLocator newConverterLocator = (ConverterLocator) super.newConverterLocator();
newConverterLocator.set(Locale.class, new LocaleConverter());
return newConverterLocator;
}
此方法需要包含在您的应用程序类中。