clever
Novembro 30, 2011, 9:19am
#1
Olá pessoal, estou com problemas para fazer um p:autoComplete usando EJB 3.1.
O meu conversor esta assim:
[code]@FacesConverter (value=“carroceriaConverter”, forClass = java.lang.String.class)
public class CarroceriaConverter implements Converter {
@EJB
private CarroceriaService serviceCarroceria;
@Override
public Object getAsObject(FacesContext fc, UIComponent uic, String string) {
Carroceria carroceria = null;
try {
carroceria = serviceCarroceria.getCarroceriaWithDescricao(string);
} catch (ClassNotFoundException ex) {
Logger.getLogger(CarroceriaConverter.class.getName()).log(Level.SEVERE, null, ex);
} catch (PersistenceException ex) {
Logger.getLogger(CarroceriaConverter.class.getName()).log(Level.SEVERE, null, ex);
}
return carroceria;
}
@Override
public String getAsString(FacesContext fc, UIComponent uic, Object obj)
throws ClassCastException {
Carroceria combustivel = (Carroceria) obj;
return combustivel.getDescricao();
}
}[/code]
No meu faces-config declarei o conversor assim:
<managed-bean>
<managed-bean-name>carroceriaConverter</managed-bean-name>
<managed-bean-class>br.com.transbr.converrsores.CarroceriaConverter</managed-bean-class>
<managed-bean-scope>request</managed-bean-scope>
</managed-bean>
E no xhtml chamo ele assim:
<p:autoComplete id="genero" value="#{carretaMBean.carreta.carroceria}"
completeMethod="#{carretaMBean.carrocerias}" var="carroceria" itemValue="#{carroceria}"
itemLabel="#{carroceria.descricao}" dropdown="true" converter="carroceriaConverter"/>
O problame é que o meu serviceCarroceria no conversor esta retornando null nao sei porque. Alguem pode me ajudar?
Vc não declara o conversor como um ManagedBean, tem a parte própria dele no faces-config.xml.
Eu removeria a declaração dele no faces-config(JEE 6 usa mais anotações que XML) e colocaria um @Named (“carroceriaConverter”) no conversor.(Acho que não precisa da anotação FacesConverter/Named juntos faz os testes com as duas e depois com uma de cada vez e vê com qual funciona).
O EJB não é injetado em Converter o que voce tera que fazer é remover
@FacesConverter(value="carroceriaConverter", forClass = java.lang.String.class)
remover a configuração no faces-config
e colocar uma instancia dele no seu managed bean e o seu EJB tambem ex
[code]public class CidadeConverter implements Converter, Serializable
{
private static final long serialVersionUID = 1L;
private CidadeService service = null;
@Override
public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2)
{
return service.findById(Integer.parseInt(arg2));
}
@Override
public String getAsString(FacesContext arg0, UIComponent arg1, Object arg2)
{
return ((Cidade) arg2).getId().toString();
}
public CidadeService getService()
{
return service;
}
public void setService(CidadeService service)
{
this.service = service;
}
}[/code]
public EnderecoBean
{
private CidadeConverter cidadeConverter = null;
@EJB
private CidadeService cidadeService = null;
public CidadeConverter getConverterCidade()
{
if(cidadeConverter == null)
{
cidadeConverter = CidadeConverter();
cidadeConverter.setService(cidadeService);
}
return cidadeConverter;
}
}
Seu xhtml no componente use a tag converter dele passando o metodo get do seu bean
Espero que tenha entendido
clever
Novembro 30, 2011, 9:39am
#4
Ms entao no faces-config nao declaro nada?
não porque tera que ser feito manualmente
clever
Novembro 30, 2011, 12:53pm
#7
fiz as modificações que vc mandou, mas agora o carroceriaConverter vem null lá no meu bean. Oque pode ser?
Bean
[code]public List getCarrocerias() {
return carroceriaService.getCarroceria();
}
public CarroceriaConverter getConverterCarroceria() {
if (carroceriaConverter == null) {
carroceriaConverter.setServiceCarroceria(carroceriaService);
}
return carroceriaConverter;
}[/code]
XHTML:
<p:autoComplete id="genero" value="#{carretaMBean.carreta.carroceria}"
completeMethod="#{carretaMBean.carrocerias}" var="carroceria" itemValue="#{carroceria}"
itemLabel="#{carroceria.descricao}" dropdown="true" converter="#{carretaMBean.converterCarroceria}"/>
[quote=clever]fiz as modificações que vc mandou, mas agora o carroceriaConverter vem null lá no meu bean. Oque pode ser?
Bean
[code]public List getCarrocerias() {
return carroceriaService.getCarroceria();
}
public CarroceriaConverter getConverterCarroceria() {
if (carroceriaConverter == null) {
carroceriaConverter.setServiceCarroceria(carroceriaService);
}
return carroceriaConverter;
}[/code]
XHTML:
<p:autoComplete id="genero" value="#{carretaMBean.carreta.carroceria}"
completeMethod="#{carretaMBean.carrocerias}" var="carroceria" itemValue="#{carroceria}"
itemLabel="#{carroceria.descricao}" dropdown="true" converter="#{carretaMBean.converterCarroceria}"/>
[/quote]
Falto voce instanciar o converter
public CarroceriaConverter getConverterCarroceria() {
if (carroceriaConverter == null) {
carroceriaConverter = new CarroceriaConverter();
carroceriaConverter.setServiceCarroceria(carroceriaService);
}
return carroceriaConverter;
}
clever
Novembro 30, 2011, 7:22pm
#9
Agora esta dando o seguinte erro:
[javax.enterprise.resource.webcontainer.jsf.lifecycle] (http–127.0.0.1-8080-2) For input string: “”:
java.lang.NumberFormatException: For input string: “”
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) [:1.6.0_20]
at java.lang.Integer.parseInt(Integer.java:470) [:1.6.0_20]
at java.lang.Integer.parseInt(Integer.java:499) [:1.6.0_20]
at br.com.transbr.converrsores.CarroceriaConverter.getAsObject(CarroceriaConverter.java:21) [classes:]
Nesse método do converter:
[code]public String getAsString(FacesContext fc, UIComponent uic, Object obj) {
return ((Carroceria) obj).getCodigocarroceria().toString();
}[/code]
[quote=clever]Agora esta dando o seguinte erro:
[javax.enterprise.resource.webcontainer.jsf.lifecycle] (http–127.0.0.1-8080-2) For input string: “”:
java.lang.NumberFormatException: For input string: “”
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:48) [:1.6.0_20]
at java.lang.Integer.parseInt(Integer.java:470) [:1.6.0_20]
at java.lang.Integer.parseInt(Integer.java:499) [:1.6.0_20]
at br.com.transbr.converrsores.CarroceriaConverter.getAsObject(CarroceriaConverter.java:21) [classes:]
Nesse método do converter:
[code]public String getAsString(FacesContext fc, UIComponent uic, Object obj) {
return ((Carroceria) obj).getCodigocarroceria().toString();
}[/code][/quote]
O metodo getCodigocarroceria
faz o q?
esse erro geralmente é por esta dando Tenntado converter para integer ou double uma string inválida tipo
Integer.parseInt("A");
clever
Dezembro 1, 2011, 7:42am
#11
O método getBuscaCodigo pega a carroceria pelo código, assim:
[code]public Carroceria getBuscaCodigo(Integer codigocaroceria) {
Session ses = getSession();
Query query = ses.createQuery("SELECT cria FROM Carroceria cria WHERE cria.codigocarroceria = :codigocarroceria");
query.setInteger("codigocarroceria", codigocaroceria);
Carroceria carroceria = (Carroceria) query.uniqueResult();
return carroceria;
}[/code]
e meu conversor esta assim:
[code]public Object getAsObject(FacesContext fc, UIComponent uic, String value) {
return carroceriaService.getBuscaCodigo(Integer.parseInt(value));
}
public String getAsString(FacesContext fc, UIComponent uic, Object value) {
return ((Carroceria) value).getCodigocarroceria().toString();
}[/code]
clever
Dezembro 1, 2011, 8:11am
#12
o método getCodigocarroceria pega o código da carroceria que esta na entridade Carroceria:
[code]public class Carroceria extends AbstractEntidade {
@GeneratedValue (strategy=GenerationType.IDENTITY)
private Integer codigocarroceria;
public Integer getCodigocarroceria() {
return codigocarroceria;
}
......
}[/code]
Amigo voce tem certeza que o erro esta nesse metodo e não no metodo
public Object getAsObject(FacesContext arg0, UIComponent arg1, String arg2)
?
clever
Dezembro 1, 2011, 6:59pm
#14
Resolvi. Ficou assim:
Conversor:
[code]@EJB
private CarroceriaService carroceriaService = null;
@Override
public Object getAsObject(FacesContext fc, UIComponent uic, String value) {
if (value.isEmpty()) {
return null;
}
return carroceriaService.getBuscaCodigo(Integer.parseInt(value));
}
@Override
public String getAsString(FacesContext fc, UIComponent uic, Object value) {
return ((Carroceria) value).getCodigocarroceria().toString();
}
public CarroceriaService getServiceCarroceria() {
return carroceriaService;
}
public void setServiceCarroceria(CarroceriaService serviceCarroceria) {
this.carroceriaService = serviceCarroceria;
}[/code]
Bean:
[code]public List carrocerias(String descricao) {
return carroceriaService.getCarroceriaWithDescricao(descricao);
}
public CarroceriaConverter getConverterCarroceria() {
if (carroceriaConverter == null) {
carroceriaConverter = new CarroceriaConverter();
carroceriaConverter.setServiceCarroceria(carroceriaService);
}
return carroceriaConverter;
}[/code]
xhtml:
<p:autoComplete id="genero" value="#{carretaMBean.carreta.carroceria}"
completeMethod="#{carretaMBean.carrocerias}" var="carroceria" itemValue="#{carroceria}"
itemLabel="#{carroceria.descricao}" dropdown="true" converter="#{carretaMBean.converterCarroceria}"/>
Muito obrigado pela ajuda.
Abraço.
Beleza, coloque resolvido no começo do titulo do topico