У меня есть этот объект под названием «Операция»:
@Entity
@Table(name="operation")
public class Operation implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE)
private Integer id;
@NotNull(message="informe um tipo de operação")
private String operation;
//bi-directional many-to-one association to Product
@OneToMany(mappedBy="operation")
private List<Product> products;
// getter and setters
}
Я получаю операции следующим образом: (Это может быть через экземпляр EJB, но только для того, чтобы сохранить его локальным и, как пример, хорошо?;))
public Map<String, Object> getOperations() {
operations = new LinkedHashMap<String, Object>();
operations.put("Select an operation", new Operation());
operations.put("Donation", new Operation(new Integer(1), "donation"));
operations.put("Exchange", new Operation(new Integer(2), "exchange"));
return operations;
}
Итак, я пытаюсь получить выбранную операцию в этом selectOneMenu
:
productc
- это ManagedBean
с viewScope
, productb
- это ManagedBean с sessionScope
с product
, который является моей сущностью. Продукт включает один operation
, поэтому он выглядит примерно так:
(буква c имеет значение контроля, где все операции, связанные с моим продуктом сущности, должны обрабатываться этим компонентом, хорошо?)
Product productc (ViewScope)
-- ProductBean productb (SessionScope)
---- Product product (Entity)
-------- Operation operation (Entity)
Преобразователь такой же, как и @BalusC, который предлагается ранее:
@ManagedBean
@RequestScoped
public class OperationConverter implements Converter {
@EJB
private EaoOperation operationService;
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
if (!(value instanceof Operation) || ((Operation) value).getId() == null) {
return null;
}
return String.valueOf(((Operation) value).getId());
}
@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
if (value == null || !value.matches("\\d+")) {
return null;
}
Operation operation = operationService.find(Integer.valueOf(value));
System.out.println("Getting the operation value = " + operation.getOperation() );
if (operation == null) {
throw new ConverterException(new FacesMessage("Unknown operation ID: " + value));
}
return operation;
}
, которые извлекают операцию, выбранную, как показано в журнале:
FINE: SELECT ID, OPERATION FROM operation WHERE (ID = ?)
bind => [1 parameter bound]
INFO: Getting the operation value = exchange
Поэтому при попытке отправить форму выдает следующую ошибку:
form_add_product:operation: Validation error: the value is not valid
Почему это происходит?