【问题标题】:PrimeFaces auto complete return a null objectPrimeFaces 自动完成返回一个空对象
【发布时间】:2014-09-21 16:20:44
【问题描述】:

这是我的 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;
    }


}

自动完成组件工作正常,但是当我尝试在支持 bean 中从中获取所选值时,它总是返回 null

【问题讨论】:

  • 在这种情况下 getAsString() 不应该返回 ((Order)arg2).getId() 吗?
  • 另外 prependId 也有问题,afaik 不应该使用它,因为它会弄乱 ajax
  • 你在哪里工作

标签: jsf jsf-2 primefaces converter


【解决方案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;
    }
} 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-11
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    相关资源
    最近更新 更多