Mostrando postagens com marcador jsf2. Mostrar todas as postagens
Mostrando postagens com marcador jsf2. Mostrar todas as postagens

segunda-feira, 31 de março de 2014

"A melhor tecnologia é a que eu domino!"

Hoje venho divagar sobre a questão: "Devo usar a tecnologia que domino mais ou o a mais adequada ao projeto?"

Essa é uma decisão difícil e alguns fatores devem ser considerados.

Cada tecnologia tem suas vantagens e desvantagens..
JSF tem as suas.. Flex tem as suas.. HTML5 tem as suas.. PHP tem as suas..
Cada tecnologia tem situações em que ela se encaixa melhor..

Muitas empresas decidem usar tecnologias com base na experiência dos desenvolvedores, é uma decisão comum e muitas vezes assertiva... mas algumas vezes isso não se conjectura como melhor escolha e é necessário tomar outra decisão...

Uma grande empresa que trabalhei desenvolveu muitos sistemas em Flex.. e agora está reescrevendo tudo... (Não quero julgar esse caso em específico, só estou dando um exemplo).

Nesta mesma empresa iríamos desenvolver um sistema de ponto eletrônico e controle de acesso (catracas)... na época estava surgindo o JSF2.. todo mundo falou pra usar o JSF 1.2 até porque haviam outros sistemas em JSF 1.2 na equipe.. eu contrariei o que as pessoas falaram e desenvolvi em JSF 2... recebi muitas críticas por isso, mas permaneci firme porque sabia que era o mais acertado.. esses outros sistemas já existentes usavam Spring e eu coloquei EJB/JPA no projeto mesmo que ninguém na equipe conhecia isso... Usei JBoss ao invés de Tomcat... Enfim, a arquitetura mudou bastante em relação aos projetos existentes.
Seis meses depois.. todos os sistemas desenvolvidos em JSF 1.2 e Spring foram reescritos em JSF 2 e EJB...

Em outra empresa, entrei em um cliente e começamos a usar o Git ao invés de SVN.. fui muito criticado por causa disso pelos desenvolvedores que apenas conheciam SVN... e hoje está mais que provado que foi a melhor escolha...

Em um projeto novo que está começando agora e estou envolvido surgiu a discussão HTML5xJSF... Queriam utilizar JSF pois a equipe atual domina mais esta tecnologia.. Caso seja escolhido HTML5 muita gente vai criticar, no primeiro problema que alguém tiver vai reclamar e vai falar "Se fosse JSF já estaria pronto", porém, com JSF também teríamos problemas..

Entendo que no início a produtividade seja mais baixa com HTML5, porém em pouco tempo isto mudará.

Neste projeto em específico acredito que não devemos usar JSF só por que conhecemos mais, não seria a melhor escolha para esse projeto pois JSF foi criado para sistemas corporativos.. enterprise... Para um número não muito grande de usuários simultâneos. Que não é o cenário do novo projeto.

Claro que outros fatores como prazo, orçamento, se os envolvidos querem pensar a curto ou longo prazo, abertura a assumir riscos, entre outros, vão influenciar na escolha também, mas escolher a tecnologia mais adequada deve pelo menos entrar nas discussões.

Enfim, a frase "A melhor tecnologia é a que eu domino" é muito comum, porém, nem sempre funciona.

terça-feira, 27 de agosto de 2013

Error loading theme, cannot find "theme.css" resource of "primefaces-bootstrap" library

Pessoal.. hoje tive o erro:

[8/27/13 15:17:23:188 BRT] 00000043 CustomExcepti E   Error loading theme, cannot find "theme.css" resource of "primefaces-bootstrap" library
                                 javax.faces.FacesException: Error loading theme, cannot find "theme.css" resource of "primefaces-bootstrap" library
    at org.primefaces.renderkit.HeadRenderer.encodeTheme(HeadRenderer.java:130)
    at org.primefaces.renderkit.HeadRenderer.encodeBegin(HeadRenderer.java:92)
    at javax.faces.component.UIComponentBase.encodeBegin(UIComponentBase.java:579)
    at javax.faces.component.UIComponentBase.encodeAll(UIComponentBase.java:519)
    at javax.faces.component.UIComponentBase.encodeAll(UIComponentBase.java:533)
    at org.apache.myfaces.view.facelets.FaceletViewDeclarationLanguage.renderView(FaceletViewDeclarationLanguage.java:1581)
    at org.apache.myfaces.application.ViewHandlerImpl.renderView(ViewHandlerImpl.java:264)
    at org.apache.myfaces.lifecycle.RenderResponseExecutor.execute(RenderResponseExecutor.java:116)
    at org.apache.myfaces.lifecycle.LifecycleImpl.render(LifecycleImpl.java:239)
    at javax.faces.webapp.FacesServlet.service(FacesServlet.java:191)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.service(ServletWrapper.java:1224)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:774)
    at com.ibm.ws.webcontainer.servlet.ServletWrapper.handleRequest(ServletWrapper.java:456)
    at com.ibm.ws.webcontainer.servlet.ServletWrapperImpl.handleRequest(ServletWrapperImpl.java:178)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.invokeTarget(WebAppFilterChain.java:136)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:97)
    at org.primefaces.webapp.filter.FileUploadFilter.doFilter(FileUploadFilter.java:79)
    at com.ibm.ws.webcontainer.filter.FilterInstanceWrapper.doFilter(FilterInstanceWrapper.java:195)
    at com.ibm.ws.webcontainer.filter.WebAppFilterChain.doFilter(WebAppFilterChain.java:91)
    at com.ibm.ws.webcontainer.filter.WebAppFilterManager.doFilter(WebAppFilterManager.java:928)
    at com.ibm.ws.webcontainer.filter.WebAppFilterManager.invokeFilters(WebAppFilterManager.java:1025)
    at com.ibm.ws.webcontainer.servlet.CacheServletWrapper.handleRequest(CacheServletWrapper.java:87)
    at com.ibm.ws.webcontainer.WebContainer.handleRequest(WebContainer.java:895)
    at com.ibm.ws.webcontainer.WSWebContainer.handleRequest(WSWebContainer.java:1662)
    at com.ibm.ws.webcontainer.channel.WCChannelLink.ready(WCChannelLink.java:195)
    at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleDiscrimination(HttpInboundLink.java:452)
    at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.handleNewRequest(HttpInboundLink.java:511)
    at com.ibm.ws.http.channel.inbound.impl.HttpInboundLink.processRequest(HttpInboundLink.java:305)
    at com.ibm.ws.http.channel.inbound.impl.HttpICLReadCallback.complete(HttpICLReadCallback.java:83)
    at com.ibm.ws.tcp.channel.impl.AioReadCompletionListener.futureCompleted(AioReadCompletionListener.java:165)
    at com.ibm.io.async.AbstractAsyncFuture.invokeCallback(AbstractAsyncFuture.java:217)
    at com.ibm.io.async.AsyncChannelFuture.fireCompletionActions(AsyncChannelFuture.java:161)
    at com.ibm.io.async.AsyncFuture.completed(AsyncFuture.java:138)
    at com.ibm.io.async.ResultHandler.complete(ResultHandler.java:204)
    at com.ibm.io.async.ResultHandler.runEventProcessingLoop(ResultHandler.java:775)
    at com.ibm.io.async.ResultHandler$2.run(ResultHandler.java:905)
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1659)

[8/27/13 15:17:23:188 BRT] 00000043 SystemOut     O
 DEBUG ERROR
[8/27/13 15:17:23:188 BRT] 00000043 SystemOut     O


O erro foi pois eu tinha isso no meu web.xml:

    <context-param>
        <param-name>primefaces.THEME</param-name>
        <param-value>bootstrap</param-value>
    </context-param>

porém eu não tinha a dependência no meu pom.xml para o primefaces-bootstrap.. por isso acontecia o erro..

Abraços!
Adriano Schmidt

sábado, 22 de junho de 2013

JSF 2.2

E aí pessoal..

Hoje estava em um cliente que tem uma aplicação com JSF 2.1 e EJB 3.1 rodando no JBoss AS 7.

Essa aplicação tem centenas de acessos simultâneos e estávamos com problemas de uso de memória e de performance.

Sei que JSF talvez não seja a tecnologia mais adequada para projetos como esse, mas não poderíamos mudar isso agora.

Nós migramos a aplicação de JSF 2.1 para JSF 2.2 e tivemos muitos ganhos! O consumo de memória diminuiu consideravelmente! O GC conseguiu rodar melhor e limpar o heap bem mais do que fazia no JSF 2.1! Não sei se foi apenas por consequência do melhor uso da memória, mas a performance aumentou muito também!

Tudo isso foi constatado pelos próprios usuários e também por testes com o JMeter e com análises utilizando o VisualVM.

Enfim, fica a dica pessoal, usem o JSF 2.2!

Para implantar ele no JBoss AS 7 foi bem tranquilo! Nós seguimos este tutorial: http://www.marcusschiesser.de/2013/01/how-to-use-jsf-2-2-with-jboss-7-1/

Só um porém.. alguns componentes na aplicação tinham update="@form" ou update="idDeUmForm" e isso parou de funcionar no JSF 2.2 :/

Não sei o motivo.. aqui eram poucos casos e resolvemos alterando o update para atualizar o componente que devia ser atualizado e não todo o form.

Ao invés de update="@form" usamos update="idDoComponenteDentroDoFormQueTinhaQueSerAtualizado" : )

Abraços!!
Adriano Schmidt

quarta-feira, 4 de abril de 2012

Attribute name "checked" associated with an element type "input" must be followed by the ' = ' character.

Olá,

Em um projeto com JSF2 ao usar o atributo checked dessa forma:

<input type="radio" name="cc" onclick="test1(0); test2(0);" checked> <h:outputLabel value="#{i18n.test}"/> </input>

eu tive o seguinte erro:

08:49:06,576 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/localhost8080].[Faces Servlet]] Servlet.service() for servlet Faces Servlet threw exception: javax.faces.view.facelets.FaceletException: Error Parsing /resources/localhost8080/TestFormComponent.xhtml: Error Traced[line: 138] Attribute name "checked" associated with an element type "input" must be followed by the ' = ' character.
at com.sun.faces.facelets.compiler.SAXCompiler.doCompile(SAXCompiler.java:387) [:2.0.2-FCS]
at com.sun.faces.facelets.compiler.SAXCompiler.doCompile(SAXCompiler.java:361) [:2.0.2-FCS]
at com.sun.faces.facelets.compiler.Compiler.compile(Compiler.java:117) [:2.0.2-FCS]
at com.sun.faces.facelets.impl.DefaultFaceletFactory.createFacelet(DefaultFaceletFactory.java:331) [:2.0.2-FCS]

para resolver usei checked="checked":

<input type="radio" name="cc" onclick="test1(0); test2(0);" checked="checked"> <h:outputLabel value="#{i18n.test}"/> </input>

Simples assim : )

Abraços!
Adriano Schmidt

quinta-feira, 17 de março de 2011

p:tabView volta primeira aba

Olá,

O TabView do primefaces volta para a primeira aba em algumas situacoes (quando ele está dentro de um <a4j:outputPanel ajaxRendered="true"> e dentro de um tab tem um rich:datatable e um botão é pressionado no datascroller (nossa, é difícil, mas aconteceu comigo)).

Para resolver isso, simplesmente tire o tabView do outputPanel.

Caso isso não possa ser feito, na troca de aba deve ser setado o 'activeIndex' do tabView. Da seguinte forma:

No tabView deve ser adicionado o tabChangeListener e o activeIndex. E as tabs devem ter seu id setado:

<p:tabView tabChangeListener="#{myBean.onTabChange}" activeIndex="#{myBean.currentTab}">
<p:tab title="primeria aba" id="tab0">
</tab>

<p:tab title="segunda aba" id="tab1">
</tab>

<p:tab title="terceira aba" id="tab2">
</tab>
</p:tabView>


No Bean adicione isso:

private int currentTab = 0;

public int getCurrentTab() {
return currentTab;
}

public void setCurrentTab(int currentTab) {
this.currentTab = currentTab;
}

public void onTabChange(org.primefaces.event.TabChangeEvent event) {
String id = event.getTab().getId();
if (id.equals("tab0")) {
this.setCurrentTab(0);
} else if (id.equals("tab1")) {
this.setCurrentTab(1);
} else if (id.equals("tab2")) {
this.setCurrentTab(2);
}
}


Acredito que isso não funciona no primefaces 2.1.. aqui no 2.2.1 funcionou..

É isso, vaaleu. Abraço.

terça-feira, 8 de março de 2011

erro converter jsf

Olá,

Ao criar um converter para utilizar na minha aplicação JSF, tive um problema quando defino ele com o forClass e value (converter-for-class e converter-id no faces-config.xml) simultaneamente.

Apenas um dos dois é permitido, os dois juntos não! Se precisa disso terá que criar duas classes diferentes.

Veja como não pode ser feito:

<converter>
<converter-id>Localhost8080Converter</converter-id>
<converter-for-class>java.lang.String</converter-for-class>
<converter-class>br.com.localhost8080.Localhost8080Converter</converter-class>
</converter>

@FacesConverter(forClass = String.class, value="Localhost8080Converter")
public class Localhost8080Converter implements Converter { ... }

É isso aí. Abraços.
Adriano Schmidt

segunda-feira, 7 de fevereiro de 2011

JSF Acentuação IE

Olá, eu estava tendo problemas com caracteres especiais.. nos meus cadastros as palavras que tinham acento ou cedilha chegavam no java desconfiguradas (São Paulo virava São Paulo).

Fiz algumas tentativas frustradas:

<f:view contentType="text/html; charset=UTF-8" encoding="UTF-8">
<f:view contentType="text/html; charset=ISO-8859-1" encoding="ISO-8859-1">
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8' />
<meta http-equiv='Content-Type' content='text/html; charset=ISO-8859-1' />
<h:form acceptcharset="UTF-8">
<h:form acceptcharset="ISO-8859-1"> (essa funcionou em todos os browsers, menos no ie)

Alterei o web.xml:
<locale-encoding-mapping-list>
<locale-encoding-mapping>
<locale>pt< <encoding>ISO-8859-1</encoding> (tentei com UTF-8 tmb)
</locale-encoding-mapping>
</locale-encoding-mapping-list>

Mas nada funcionou...

Pra resolver fiz o seguinte:

Coloquei a seguinte linha no início de todos os .xhtml
<?xml version="1.0" encoding="UTF-8"?>

No web.xml eu adicionei o seguinte:
<filter>
<filter-name>CharsetFilter</filter-name>
<filter-class>br.com.localhost8080.infrastructure.CharsetFilter</filter-class>
<init-param>
<param-name>requestEncoding</param-name>
<param-value>ISO-8859-1</param-value>
</init-param>
</filter>

<filter-mapping>
<filter-name>CharsetFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

E criei uma classe chamada CharsetFilter no pacote br.com.localhost8080.infrastructure:

package br.com.localhost8080.infrastructure;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

public class CharsetFilter implements Filter {

private String encoding;

public void init(FilterConfig config) throws ServletException {
this.encoding = config.getInitParameter("requestEncoding");

if (this.encoding == null) {
this.encoding = "ISO-8859-1";
}
}

public void doFilter(ServletRequest request, ServletResponse response, FilterChain next) throws IOException, ServletException {
if (null == request.getCharacterEncoding()) {
request.setCharacterEncoding(this.encoding);
}

response.setContentType("text/html; charset=ISO-8859-1");
response.setCharacterEncoding("ISO-8859-1");

next.doFilter(request, response);
}

public void destroy() {
}
}

Isso resolveu o problema de acentuação no submit dos formulários em todos os browsers (Para essa resolução foi de grande ajuda o site stackoverflow.com)

Porém... eu ainda tava com problemas no internet explorer em alguns campos que eram atualizados via ajax ou via rerenderização da tela no retorno de forms.

Para resolver isso criei dois converters, um eu uso para campos atualizados via ajax (ConverterCharset) e outro eu uso para campos atualizados via rerenderização da tela nos retornos dos forms (ConverterString).

Para campos atualizados via ajax é necessário adicionar converter="converterCharset"
<h:inputText value="#{myBean.myObject.name}" converter="converterCharset"/>

ConverterCharset.java:
package br.com.localhost8080.infrastructure;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
import javax.faces.convert.FacesConverter;

import br.com.localhost8080.infrastructure.StringUtils;

@FacesConverter(value = "converterCharset")
public class ConverterCharset implements Converter {

public Object getAsObject(FacesContext arg0, UIComponent arg1, String value) throws ConverterException {
return value;
}

public String getAsString(FacesContext arg0, UIComponent arg1, Object value) throws ConverterException {
String convertedString = StringUtils.convertUtf8ToIso88591(value);
return convertedString;
}
}

ConverterString.java:

package br.com.localhost8080.infrastructure;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.ConverterException;
import javax.faces.convert.FacesConverter;

import br.com.localhost8080.infrastructure.StringUtils;

@FacesConverter(forClass = String.class, value="Test")
public class ConverterString implements Converter {

//vem da tela / request
public Object getAsObject(FacesContext arg0, UIComponent arg1, String value) throws ConverterException {
if ("".equals(value.toString().trim())) {
return null;
}

String convertedString = StringUtils.convertUtf8ToIso88591(value);
return convertedString;
}

//vai para tela / response
public String getAsString(FacesContext arg0, UIComponent arg1, Object value) throws ConverterException {
String convertedString = StringUtils.convertUtf8ToIso88591(value);
return convertedString;
}
}

Ambos os converters tinham um código de conversão de UTF-8 para ISO-8859-1 que foi externalizado para a classe StringUtils.
package br.com.localhost8080.infrastructure;

public class StringUtils {
/**
* Verifica se valor string do objeto passado como parametro e UTF-8 e entao converte para ISO-8859-1
*/
public static String convertUtf8ToIso88591(Object value) {
if (value instanceof String == false) {
return value.toString();
}

String originalValue = (String) value;

// verifica se e UTF-8 (se tem caracteres especiais)
if (originalValue.contains("Ã") || originalValue.contains("Â")) {
java.nio.charset.Charset utf8charset = java.nio.charset.Charset.forName("UTF-8");
java.nio.charset.Charset iso88591charset = java.nio.charset.Charset.forName("ISO-8859-1");
java.nio.ByteBuffer inputBuffer = java.nio.ByteBuffer.wrap(originalValue.getBytes());
// decode UTF-8
java.nio.CharBuffer data = utf8charset.decode(inputBuffer);
// encode ISO-8559-1
java.nio.ByteBuffer outputBuffer = iso88591charset.encode(data);
byte[] outputData = outputBuffer.array();

String convertedString = new String(outputData);

// se a conversao deu errado retorna o valor original
if (convertedString.contains("?")) {
return originalValue;
}

// retorna o valor convertido
return convertedString;
}

return originalValue;
}
}


É isso.. sem mais problemas de acentuação.

Abraço,
Adriano Schmidt

segunda-feira, 24 de janeiro de 2011

richfaces popupPanel ie8

Olá,

Estou num projeto utilizando JSF 2.0 e RichFaces 4.

Meu popupPanel (antigo modalPanel) estava desrespeitando os atributos width e height no ie8 ficando bem grande no browser.. no firefox tudo funcionava perfeitamente.

O problema era que eu estava usando o componente inputCalendar do tomahawk.. ao usar a propriedade renderAsPopup como true, o meu popupPanel se perdia e ficava com um tamanho diferente do que setei.

Solução: Troquei o inputCalendar do tomahawk pelo calendar do RichFaces.

Show! Funcionou!
Adriano Schmidt

quarta-feira, 22 de dezembro de 2010

UIInstructions cannot be cast to AbstractTogglePanelItem

Hoje me aconteceu o seguinte erro num projeto com jsf2 e richfaces4:

com.sun.faces.facelets.compiler.UIInstructions cannot be cast to org.richfaces.component.AbstractTogglePanelItem

No meu caso descobri que o que causava isso eram comentários dentro do tabPanel.

NÃO FUNCIONA:
<rich:tabPanel>
<rich:tab header="aaaaa">
<h:outputText value="aaaaaaaaaa"></h:outputText>
</rich:tab>
<!— esse comentario gerou o erro -->
<rich:tab header="bbbbb">
<h:outputText value="bbbbbbbbbb"></h:outputText>
</rich:tab>
</rich:tabPanel>

FUNCIONA:
<rich:tabPanel>
<rich:tab header="aaaaa">
<h:outputText value="aaaaaaaaaa"></h:outputText>
</rich:tab>
<rich:tab header="bbbbb">
<h:outputText value="bbbbbbbbbb"></h:outputText>
</rich:tab>
</rich:tabPanel>


Log com mais detalhes:
10:36:35,449 SEVERE [javax.enterprise.resource.webcontainer.jsf.application] Error Rendering View[/resources/user/UserForm.xhtml]: java.lang.ClassCastException: com.sun.faces.facelets.compiler.UIInstructions cannot be cast to org.richfaces.component.AbstractTogglePanelItem
at org.richfaces.renderkit.html.TogglePanelRenderer.getChildrenScriptObjects(TogglePanelRenderer.java:178) [:4.0.0-SNAPSHOT]

[…]
10:36:35,493 ERROR [org.apache.catalina.core.ContainerBase.[jboss.web].[localhost].[/l8-web].[Faces Servlet]] Servlet.service() for servlet Faces Servlet threw exception: java.lang.ClassCastException: com.sun.faces.facelets.compiler.UIInstructions cannot be cast to org.richfaces.component.AbstractTogglePanelItem
at org.richfaces.renderkit.html.TogglePanelRenderer.getChildrenScriptObjects(TogglePanelRenderer.java:178) [:4.0.0-SNAPSHOT]
at org.richfaces.renderkit.html.TogglePanelRenderer.getScriptObjectOptions(TogglePanelRenderer.java:147) [:4.0.0-SNAPSHOT]

[…]

Syntax error in EL - & E comercial - JSF

Pra usar & (E comercial) em JSF num bloco como
#{var1 == 1 && var2 == 2}

você pode usar ‘and’, assim:
#{var1 == 1 and var2 == 2}

além de 'and' você pode usar 'or' ou 'eq'

mais informações em:
http://developers.sun.com/docs/jscreator/help/jsp-jsfel/jsf_expression_language_intro.html

Vaaaleu!

datascrooler richfaces não funciona

Ao usar o datascrooler do richfaces ao apertar para ir para uma outra página nada acontecia, apenas no cabeçalho do browser aparecia “Erro na página”.

No meu caso o dataTable e o dataScrooler não estavam dentro de um form, ao colocar os dois componentes no mesmo form o problema foi resolvido.

datascrooler richfaces ecss

Ao usar o datascrooler do richfaces saiu no log os seguintes warnings:

10:28:06,362 WARNING [javax.enterprise.resource.webcontainer.jsf.context] JSF1091: Nenhum tipo de mime pôde ser encontrado para o arquivo skinning.ecss. Para resolver isso, adicione um mapeamento de mime-type ao web.xml do aplicativo.
10:28:06,376 WARNING [javax.enterprise.resource.webcontainer.jsf.context] JSF1091: Nenhum tipo de mime pôde ser encontrado para o arquivo panel.ecss. Para resolver isso, adicione um mapeamento de mime-type ao web.xml do aplicativo.
10:28:06,386 WARNING [javax.enterprise.resource.webcontainer.jsf.context] JSF1091: Nenhum tipo de mime pôde ser encontrado para o arquivo datatable.ecss. Para resolver isso, adicione um mapeamento de mime-type ao web.xml do aplicativo.
10:28:06,394 WARNING [javax.enterprise.resource.webcontainer.jsf.context] JSF1091: Nenhum tipo de mime pôde ser encontrado para o arquivo datascroller.ecss. Para resolver isso, adicione um mapeamento de mime-type ao web.xml do aplicativo.

Para resolver adicionei o seguinte trecho no web.xml:
<mime-mapping>
<extension>ecss</extension>
<mime-type>text/css</mime-type>
</mime-mapping>