Java EE - Aproveite toda a plataforma para construir aplicações

java-ee

#21

Fico feliz que tenha conseguido.
É estranho que só funcionou com essa alteração porque seu projeto no meu ambiente funcionou normalmente.
Bons estudos.


#22

Olá,

Passei a ter problemas no cadastro de livros (webapp.admin.livros.form.xhtml), quando inseri a relação de muitos para muitos com os autores. O sistema tentar salvar, mas ocorre um erro de conversão de tipos. A causa chega ser dantesca, pois a mensagem de erro que recebo é totalmente nonsense:

Can not set java.lang.Integer field br.com.casadocodigo.loja.models.Author.id to java.lang.Integer

Eles diz que não posso “setar” um Integer para um Integer.

Eu copiei as configurações do form.xhtml do código do sistema completo disponibilizado pela Casadocódigo.

Esse é o codigo de vocês:

		<h:outputLabel>Autores</h:outputLabel>
		<h:selectManyListbox value="#{adminBooksBean.product.authors}"
			converter="entityConverter">
			<f:selectItems value="#{authorsList.get()}" var="author"
				itemLabel="#{author.name}" itemValue="#{author}" />
		</h:selectManyListbox>

Tentei executar dessa maneira, mas o sistema não reconhece a expressão “entityConverter”.

Então alterei para o seguinte código:

		<h:outputLabel>Autores</h:outputLabel>
                    <h:selectManyListbox value="#{adminBooksBean.product.authors}"
			converter="javax.faces.Integer">
                         <f:selectItems value="#{adminBooksBean.authors}" var="author"
                           itemLabel="#{author.name}" itemValue="#{author.id}"/>
		</h:selectManyListbox>

Quando eu não havia colocado a tag converter o erro pelo menos tinha lógica: dizia que não poderia converter um Integer para um String

Espero que possam me ajudar porque é um erro difícil de rastrear, pois ocorre na camada do servidor de aplicação que fica oculta para mim. Não é um erro no meu código, mas no container.

Grato,

João


#23

Faltou você adicionar a classe EntityConverter que tem na explicação da página 102 a 104 do livro.

@FacesConverter("entityConverter")
public class EntityConverter implements Converter {

#24

Funcionou,

Grato, Gracyane.

Até o próximo erro rs.


#25

Olá, Gracyane,

Cheguei na parte do livro onde o autor descreve como direcionar mensagens aos usuários. Eu preferi usar a classe MessagesHelper do código fonte da Casa do Código. Estou tendo problemas no @Inject na propriedade FacesContext facesContext com a seguinte descrição de erro:

“{
“WFLYCTL0080: Failed services” => {“jboss.deployment.unit.\“casadocodigo.war\”.WeldStartService” => “org.jboss.msc.service.StartException in service jboss.deployment.unit.\“casadocodigo.war\”.WeldStartService: Failed to start service
Caused by: org.jboss.weld.exceptions.DeploymentException: WELD-001408: Unsatisfied dependencies for type FacesContext with qualifiers @Default
at injection point [BackedAnnotatedField] @Inject private br.com.casadocodigo.loja.infra.MessagesHelper.facesContext
at br.com.casadocodigo.loja.infra.MessagesHelper.facesContext(MessagesHelper.java:0)
”},
“WFLYCTL0412: Required services that are not installed:” => [“jboss.deployment.unit.\“casadocodigo.war\”.WeldStartService”],
“WFLYCTL0180: Services with missing/unavailable dependencies” => undefined
}”

Na IDE do Netbeans há uma advertência justamente no ponto de injeção “No enabled elegible for injection beans are found”

Grato pela atenção,

João Carlos Vidoto


#26

Olá João,
Na página 77 e 78 do livro, o autor menciona esse erro que você colocou acima. O que acontece é que o FaceContext não é gerenciado pelo container de injeção do CDI, desta forma você tem que criar uma classe Producer para ensinar ao CDI como ele deve instanciar uma classe do tipo FacesContext. Na página 78 tem o código de exemplo.

package br.com.casadocodigo.loja.infra;
import javax.enterprise.context.ApplicationScoped;
import javax.enterprise.context.RequestScoped;
import javax.enterprise.inject.Produces;
import javax.faces.context.FacesContext;

@ApplicationScoped
public class FacesContextProducer {

  @Produces
  @RequestScoped
  public FacesContext get(){
       return FacesContext.getCurrentInstance();
  }
}

#27

Funcionou,

Muito obrigado Gracyane, qualquer problema eu entro em contato. Desde já agradeço antecipadamente a sua ajuda.

João


#28

Olá, Gracyane,

O problema que estou tendo agora é com a conversão do tipo Date para o tipo Calendar. Eu copiei a classe CalendarConverter do código de vocês, mas mesmo assim ocorre o seguinte erro com problemas de conversão:

17:26:00,628 ERROR [io.undertow.request] (default task-2) UT005023: Exception handling request to /casadocodigo/admin/livros/form.xhtml;jsessionid=s1lQQysAFtc0kMJyJpYiWUZnOf7qj1Ytwl6xBxtd.desktop-cd2vrou: javax.servlet.ServletException: java.lang.IllegalArgumentException: Cannot convert 11/05/76 00:00 of type class java.util.Date to class java.util.Calendar

Caused by: javax.faces.component.UpdateModelException: java.lang.IllegalArgumentException: Cannot convert 11/05/76 00:00 of type class java.util.Date to class java.util.Calendar

A declaração da parte do formulário (form.xhtml) relativa à data está assim:

**<h:outputLabel>Data de lançamento</h:outputLabel>
<h:inputText value="#{adminBooksBean.product.releaseDate}" label=“Data de Lançamento” pt:type=“date”>
<f:convertDateTime pattern=“dd/MM/yyyy”/>
</h:inputText>
**
Eu coloquei a tag f:convertDateTime, porque, do contrário, ele não aceitava como data qualquer formato de data que eu informava 11/10/2017, 2017/10/11, etc. Ele também está ignorando a anotação @future e aceitando datas passadas

Grato pela atenção,

João Carlos Vidoto


#29

O <h:inputText> do seu código tem um atributo pt:type=“date”. Depois que o autor colocou o converter ele retirou do <h:inputText> o type.

Deixa essa parte que nem está no livro:

<h:outputLabel>Data de lançamento</h:outputLabel>
<h:inputText
value="#{adminBooksBean.product.releaseDate}">
<f:convertDateTime pattern="yyyy-MM-dd"/>
</h:inputText>

A classe public class CalendarHtml5Converter implements Converter utiliza o pattern "yyyy-MM-dd".
Veja se dá certo com o exemplo do livro.


#30

Não funcionou, Gracyane,

Defini o código da forma que você instruiu, mas continua dando o erro de conversão.

no @facesconverter substituí o forClass=Calentar.class pela string “calendarConverter”, depois para “calendarHtml5Converter” e defini no inputText a variável converter=“texto facesconverter”, semelhante ao “entityConverter”, mas não funcionou. Continuou dando erro de conversão.

Se defino a variável data como Date nas classes em que ela aparece, o código funciona. Pelo que sei o tipo Date está deprecated, mas é a única maneira para eu conseguir avançar…


#31

Olá, Gracyane

Consegui passar essa etapa, mas não conforme está no livro. No código fonte de vocês, o inputText da data está apenas com o pt:type=“date”, sem nenhuma variável converter. Também no código fonte da casa do código, tem apenas uma classe converter chamada CalendarioConverter e não a classe CalendarHtml5Converter que está no livro. Na classe CalendarConverter eu alterei a anotação @facesconveter de (forClass=Calendar.class) para a string “calendarConverter”. Por último coloque na tag <h:inputText> a variável converter=“calendarConverter”. Funcionou, mas não conforme as instruções do livro.

Vou seguir os próximos passos do livro confiante em ter menos problemas e te dar menos trabalho.

Grato,

João


#32

Olá João,

Eu li essa parte do livro melhor, segue algumas observações.

Quando se coloca o pt:type:"date", devemos criar um converter que no caso o autor criou o CalendarHtml5Converter. Neste caso não necessita colocar o atributo "converter=".

Perceba que quando o autor cria o CalendarHtml5Converter ele retira do código a expressão:

<f:convertDateTime pattern="yyyy-MM-dd"/>

Quando você submete o formulário o framework identifica esse Converter e utiliza-o nos campos que necessitam dele.

No código do livro tem-se um pattern yyyy-MM-dd. Neste caso devemos digitar no formulário por exemplo: “2017-08-01”, se você estiver utilizando o Navegador Mozilla. Se você digitar uma data anterior a de hoje ele faz essa validação e não deixa você salvar. Quando se usa o Navegador Chrome ele mostra o componente de data do html5 de forma mais estilizada, permitindo que agente selecione uma data no padrão dd/MM/yyyy.

Segue como ficou meu código:

Navegador Mozilla



#33

Olá, Gracyane,

Como a forma que fiz de certo, vou manter dessa forma para seguir nos próximos passos do livro.

Uma dúvida: como sei se estou utilizando Html5, ou como faço para usá-lo.

Obrigado pela atenção,

João


#34

Para saber se está utilizando html5 só estudando mesmo sobre o assunto. Tem muitos livros sobre html5 que abordam as “novas” marcações.