This code is a autocomplete component and works in this way : User try to find some example with part of his name, if don’t find it automatically will create a new example in the database.
example.xhtml
<p:autoComplete id="autocompleteExample"
dropdown="true"
value="#{exampleController.example}"
completeMethod="#{exampleController.autocompleteExample}"
converter="exampleConverter"
var="exemple"
itemLabel="#{example.name}"
itemValue="#{example}">
<p:ajax event="change"
process="@this"
listener="#{exampleController.takeAllExamples()}"
update="autocompleteExample" />
<f:attribute name="someValue"
id="someValue"
value="#{myController.test.id}"/>
</p:autoComplete>
ExampleConverter.java
@FacesConverter(value = "exampleConverter")
public class ExampleConverter implements Converter {
@Inject
private ExampleService exampleService;
@Inject
private TestService testService;
@Override
public Object getAsObject(FacesContext facesContext,
UIComponent uiComponent, String s) {
if(s!=null) {
Example example =
exampleService.findExampleByName(s);
if(example==null){
example = new Example();
example.setName(s);
Long someValue = (Long)uiComponent.getAttributes()
.get("someValue");
if ( someValue != null ){
Test test = testService.findById(someValue);
example.setTest(test);
}
exampleService.save(exemple);
exampleService.flush();
}
return exemple;
}
return null;
}
@Override
public String getAsString(FacesContext facesContext,
UIComponent uiComponent, Object o) {
if(o instanceof Example){
Example exemple = (Example)o;
return example.getName();
}
return "";
}
}
ExampleService.java
public Example findExampleByName(String nome) {
Criteria criteria = getSession().createCriteria(Example.class);
criteria.add(Restrictions.like("name", name).ignoreCase());
criteria.addOrder(Order.asc("name"));
return (Example)criteria.uniqueResult();
}
ExampleController.java
private Example example;
public Example getExample(){
return this.example;
}
public void setExample(Example example){
this.example = example ;
}
public List<Example> autocompleteExample(String query) {
List allExamples = exampleService.findAll();
return allExamples.stream().filter(c ->
c.getName().toUpperCase().contains(
query.toUpperCase())).collect(Collectors.toList());
}
public List<Example> takeAllExamples(){
return exampleService.findAll();
}