当前位置: 动力学知识库 > 问答 > 编程问答 >

jsf 2 - FacesConverter forClass don't work with Composite Componet

问题描述:

I've got a simple composite component which has to render a inputText. When a put the value and press commandButton the follow exception is throw:

java.lang.IllegalArgumentException: Cannot convert 1 of type class java.lang.String to class sample.entity.Product

When i use h:inputText instead d:myInputText it's work fine.

Is possible use a FacesConverter and attribute forClass for composite component? I do not like to use converter attribute or converterId of tag f:converter.

Anybody help me?

Page code:

<h:form>

<h:messages />

Product Id: <h:myInputText value="#{productController.product}"/>

<h:commandButton value="Submit" action="#{productController.someAction()}" />

Product Description: <h:outputText value="#{productController.product.description}"/>

</h:form>

Composite code:

<composite:interface>

<composite:attribute name="value"/>

<composite:editableValueHolder name="value" targets="#{cc.clientId}:value"/>

</composite:interface>

<composite:implementation>

<div id="#{cc.clientId}">

<h:inputText id="value" value="#{cc.attrs.value}"/>

<h:message for="#{cc.clientId}:value" />

</div>

</composite:implementation>

ManagedBean code:

@Named("productController")

@RequestScoped

public class ProductController {

private Product product;

public Product getProduct() {

if (product == null) {

product = new Product();

}

return product;

}

public void setProduct(Product product) {

this.product = product;

}

public void someAction() {

System.out.println("Product " + product);

}

}

Converter code:

@FacesConverter(forClass = Product.class)

public class ProductConverter implements Converter {

@Override

public Object getAsObject(FacesContext fc, UIComponent uic, String value) {

System.out.println("[DEBUG] getAsObject: " + value);

if (value == null || "".equals(value)) {

return null;

}

//TODO: some logic to get entity from database.

return new Product(new Long(value));

}

@Override

public String getAsString(FacesContext fc, UIComponent uic, Object o) {

System.out.println("[DEBUG] getAsString: " + o);

if (o == null) {

return null;

}

return String.valueOf(((Product) o).getId());

}

}

Entity code:

 public class Product {

private Long id;

private String description;

public Product() {

}

public Product(Long id) {

this.id = id;

}

public Long getId() {

return id;

}

public void setId(Long id) {

this.id = id;

}

public String getDescription() {

return description;

}

public void setDescription(String description) {

this.description = description;

}

@Override

public int hashCode() {

int hash = 7;

hash = 29 * hash + (this.id != null ? this.id.hashCode() : 0);

return hash;

}

@Override

public boolean equals(Object obj) {

if (obj == null) {

return false;

}

if (getClass() != obj.getClass()) {

return false;

}

final Product other = (Product) obj;

if (this.id != other.id && (this.id == null || !this.id.equals(other.id))) {

return false;

}

return true;

}

@Override

public String toString() {

return "Product{" + "id=" + id + '}';

}

}

I use Mojarra 2.1.14, Glassfish 3.1 and CDI.

Best regards.

网友答案:

I was able to reproduce it in Mojarra 2.1.14. This is a bug in Mojarra. It works fine in MyFaces 2.1.9. I've reported it to Mojarra guys as issue 2568. In the meanwhile, there's not really another option than explicitly specifying a <f:converter for> in the client or moving to MyFaces (which has its own set of specific quirks/issues as well though).

分享给朋友:
您可能感兴趣的文章:
随机阅读: