PrimeFaces自动完成返回一个null对象

时间:2014-07-30 06:07:29

标签: jsf jsf-2 primefaces converter

这是我的xhtml页面

<h:form id="order_search" prependId="flase">
            <p:growl id="growl" showDetail="true" autoUpdate="true"
                sticky="false" />

            <h:panelGrid columns="5" style="margin-bottom:10px" cellpadding="5">
                <p:outputLabel value="Customer Name : " for="ac_order" />
                <p:autoComplete id="ac_order" value="#{orderSearchController.orderFromAutoC}"
                    completeMethod="#{orderSearchController.autoCompleteOrder}" var="order"
                    itemLabel="#{order.customerName}" itemValue="#{order}"
                    converter="#{orderConverter}" forceSelection="true" />


                <p:commandButton id="selected" value="print" action="#{orderSearchController.printOrder}" />
            </h:panelGrid>          

        </h:form>

这是我的支持豆

@Component
@ManagedBean
@ViewScoped
public class OrderSearchController implements Serializable{
    private static final long serialVersionUID = 1L;

    @ManagedProperty(value = "#{orderService}")
    public OrderService orderService;
    public List<Order> allOrders;
    public List<Order> acFilterdOrders;
    public Order orderFromAutoC;

    @PostConstruct
    public void Init() {
        System.out.println("init gets called");
//      allOrders = new ArrayList<>();
//      orderFromAutoC = new Order();

        allOrders = orderService.getAllOrders();
        System.out.println("After  sssssss ");
    }

    public List<Order> autoCompleteOrder(String query) {
        acFilterdOrders = new ArrayList<Order>();

        for (int i = 0; i < allOrders.size(); i++) {
            if (allOrders.get(i).getCustomerName().toLowerCase().startsWith(query)) {
                acFilterdOrders.add(allOrders.get(i));
            }
        }

        return acFilterdOrders;
    }

    public String printOrder() {
        System.out.println("Inside print");

        System.out.println("Inside print : "+orderFromAutoC);

        return null;
    }
    //Getters and Setters

}

这是我的转换器代码

@ManagedBean(name = "orderConverter")
@RequestScoped
public class OrderConverter implements Converter {

    @ManagedProperty(value = "#{orderService}")
    private OrderService orderService;

    @Override
    public Object getAsObject(FacesContext arg0, UIComponent arg1, String value) {
        if (value != null && value.trim().length() > 0) {
            return orderService.getOrderById(Integer.parseInt(value));
        } else {
            return null;
        }
    }

    @Override
    public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2) {
        // TODO Auto-generated method stub
        return null;
    }

    public OrderService getOrderService() {
        return orderService;
    }

    public void setOrderService(OrderService orderService) {
        this.orderService = orderService;
    }


}

auto-complete组件工作正常,但是当我试图从支持bean中获取所选值时,它总是返回null

1 个答案:

答案 0 :(得分:1)

getAsString方法未正确实现,因为它只返回NULL值。 getAsString方法的返回值在getAsObject方法中作为值传递,并根据该方法从列表中获取值。以下是供您参考的示例。 getAsObject方法中的值是从getAsString方法返回的Id。

@Override
public Object getAsObject(FacesContext fc, UIComponent uic, String value) {
    if(value != null && value.trim().length() > 0) {
        MessageLogBean messageLogBean = (MessageLogBean) SessionUtility.getManagedBean("messageLogBean");
        DeviceResponseDTO deviceResponseDTO = new DeviceResponseDTO();
        deviceResponseDTO.setId(Integer.parseInt(value));
        List<DeviceResponseDTO> deviceResponseDTOs = messageLogBean.getDeviceResponseDTOs();
        int index = deviceResponseDTOs.indexOf(deviceResponseDTO);
        if(null != deviceResponseDTOs && !deviceResponseDTOs.isEmpty()){
        return deviceResponseDTOs.get(index);
        }
        return null;
    }
    else {
        return null;
    }
}

@Override
public String getAsString(FacesContext fc, UIComponent uic, Object object) {
    if(object != null) {
        return String.valueOf(((DeviceResponseDTO) object).getId());
    }
    else {
        return null;
    }
}