Git Product home page Git Product logo

framework's People

Contributors

boppreh avatar botelhojp avatar brunoborges avatar cassiomaes avatar clovisjunior avatar dancovich avatar demoiselleframework avatar ednaraoliveira avatar emersonsdo avatar emobtech avatar esaito avatar fcsacin avatar jefersonmiranda avatar joaquimpedrooliveira avatar juliancesar avatar lusabo avatar marianothiago avatar oides avatar paulogladson avatar reinaldoc avatar robsonximenes avatar rodrigorgs avatar thiagosoares avatar vfcosta avatar wegneto avatar zyc avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

framework's Issues

Erro no carregamento de configurações em cenário de concorrência

Ao tentar carregar uma configuração a partir de uma classe anotada com @configuration, em um cenário de concorrência, ocorre o erro abaixo.

É possível observar pelo trace que existem 3 threads tentando carregar a configuração simultaneamente.

41,113 INFO  [org.demoiselle.jee.configuration.ConfigurationLoader] (default task-5) Carregando a classe de configuração br.gov.fazenda.tesouro.td.configuration.CMSConfig
10:22:41,114 INFO  [org.demoiselle.jee.configuration.ConfigurationLoader] (default task-4) Carregando a classe de configuração br.gov.fazenda.tesouro.td.configuration.CMSConfig
10:22:41,115 INFO  [org.demoiselle.jee.configuration.ConfigurationLoader] (default task-2) Carregando a classe de configuração br.gov.fazenda.tesouro.td.configuration.CMSConfig
10:22:41,193 INFO  [org.demoiselle.jee.configuration.ConfigurationLoader] (default task-2) *******************************************************
10:22:41,193 INFO  [org.demoiselle.jee.configuration.ConfigurationLoader] (default task-2) Carregando a classe de configuração org.demoiselle.jee.rest.DemoiselleRestConfig
10:22:41,197 INFO  [org.demoiselle.jee.configuration.ConfigurationLoader] (default task-5) *******************************************************
10:22:41,197 INFO  [org.demoiselle.jee.configuration.ConfigurationLoader] (default task-4) *******************************************************
10:22:41,197 INFO  [org.demoiselle.jee.configuration.ConfigurationLoader] (default task-5) Carregando a classe de configuração org.demoiselle.jee.rest.DemoiselleRestConfig
10:22:41,197 INFO  [org.demoiselle.jee.configuration.ConfigurationLoader] (default task-4) Carregando a classe de configuração org.demoiselle.jee.rest.DemoiselleRestConfig
10:22:41,238 INFO  [org.demoiselle.jee.configuration.ConfigurationLoader] (default task-4) -> demoiselle.rest.gzipEnabled: [não definada na fonte de configuração do projeto, maiores informações: https://demoiselle.gitbooks.io/documentacao-jee/content/configuration-general.html]
10:22:41,241 INFO  [org.demoiselle.jee.configuration.ConfigurationLoader] (default task-4) -> demoiselle.rest.showErrorDetails: [não definada na fonte de configuração do projeto, maiores informações: https://demoiselle.gitbooks.io/documentacao-jee/content/configuration-general.html]
10:22:41,239 ERROR [io.undertow.request] (default task-5) UT005023: Exception handling request to /td-rest/api/vantagem: org.demoiselle.jee.configuration.exception.DemoiselleConfigurationException: Ocorreu um erro durante a extração do tipo boolean com o extrator org.demoiselle.jee.configuration.extractor.impl.ConfigurationPrimitiveOrWrapperValueExtractor
	at org.demoiselle.jee.configuration.ConfigurationLoader.getValueFromSource(ConfigurationLoader.java:385)
	at org.demoiselle.jee.configuration.ConfigurationLoader.fillFieldWithValue(ConfigurationLoader.java:357)
	at java.util.ArrayList.forEach(ArrayList.java:1249)
	at org.demoiselle.jee.configuration.ConfigurationLoader.fillTargetObjectWithValues(ConfigurationLoader.java:336)
	at org.demoiselle.jee.configuration.ConfigurationLoader.processConfiguration(ConfigurationLoader.java:168)
	at org.demoiselle.jee.configuration.ConfigurationLoader.load(ConfigurationLoader.java:126)
	at org.demoiselle.jee.configuration.ConfigurationLoader$Proxy$_$$_WeldClientProxy.load(Unknown Source)
	at org.demoiselle.jee.configuration.ConfigurationInterceptor.constructConfiguration(ConfigurationInterceptor.java:36)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.jboss.weld.interceptor.reader.SimpleInterceptorInvocation$SimpleMethodInvocation.invoke(SimpleInterceptorInvocation.java:74)
	at org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.executeAroundInvoke(InterceptorMethodHandler.java:84)
	at org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.executeInterception(InterceptorMethodHandler.java:72)
	at org.jboss.weld.interceptor.proxy.InterceptorMethodHandler.invoke(InterceptorMethodHandler.java:56)
	at org.jboss.weld.bean.proxy.CombinedInterceptorAndDecoratorStackMethodHandler.invoke(CombinedInterceptorAndDecoratorStackMethodHandler.java:79)
	at org.jboss.weld.bean.proxy.CombinedInterceptorAndDecoratorStackMethodHandler.invoke(CombinedInterceptorAndDecoratorStackMethodHandler.java:68)
	at org.demoiselle.jee.rest.DemoiselleRestConfig$Proxy$_$$_WeldSubclass.isShowErrorDetails(Unknown Source)
	at org.demoiselle.jee.rest.DemoiselleRestConfig$Proxy$_$$_WeldClientProxy.isShowErrorDetails(Unknown Source)
	at org.demoiselle.jee.rest.exception.treatment.ExceptionTreatmentImpl.getFormatedError(ExceptionTreatmentImpl.java:64)
	at org.demoiselle.jee.rest.exception.mapper.AnyOtherExceptionMapper.toResponse(AnyOtherExceptionMapper.java:42)
	at org.demoiselle.jee.rest.exception.mapper.AnyOtherExceptionMapper$Proxy$_$$_WeldClientProxy.toResponse(Unknown Source)
	at org.jboss.resteasy.core.ExceptionHandler.executeExceptionMapper(ExceptionHandler.java:100)
	at org.jboss.resteasy.core.ExceptionHandler.unwrapException(ExceptionHandler.java:129)
	at org.jboss.resteasy.core.ExceptionHandler.handleApplicationException(ExceptionHandler.java:75)
	at org.jboss.resteasy.core.ExceptionHandler.handleException(ExceptionHandler.java:220)
	at org.jboss.resteasy.core.SynchronousDispatcher.writeException(SynchronousDispatcher.java:175)
	at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:418)
	at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:209)
	at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:221)
	at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56)
	at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:51)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
	at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85)
	at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
	at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
	at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131)
	at io.undertow.servlet.handlers.security.ServletAuthenticationCallHandler.handleRequest(ServletAuthenticationCallHandler.java:57)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.security.handlers.AuthenticationConstraintHandler.handleRequest(AuthenticationConstraintHandler.java:53)
	at io.undertow.security.handlers.AbstractConfidentialityHandler.handleRequest(AbstractConfidentialityHandler.java:46)
	at io.undertow.servlet.handlers.security.ServletConfidentialityConstraintHandler.handleRequest(ServletConfidentialityConstraintHandler.java:64)
	at io.undertow.servlet.handlers.security.ServletSecurityConstraintHandler.handleRequest(ServletSecurityConstraintHandler.java:59)
	at io.undertow.security.handlers.AuthenticationMechanismsHandler.handleRequest(AuthenticationMechanismsHandler.java:60)
	at io.undertow.servlet.handlers.security.CachedAuthenticatedSessionHandler.handleRequest(CachedAuthenticatedSessionHandler.java:77)
	at io.undertow.security.handlers.NotificationReceiverHandler.handleRequest(NotificationReceiverHandler.java:50)
	at io.undertow.security.handlers.AbstractSecurityContextAssociationHandler.handleRequest(AbstractSecurityContextAssociationHandler.java:43)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at org.wildfly.extension.undertow.security.jacc.JACCContextIdHandler.handleRequest(JACCContextIdHandler.java:61)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
	at io.undertow.servlet.handlers.ServletInitialHandler.handleFirstRequest(ServletInitialHandler.java:292)
	at io.undertow.servlet.handlers.ServletInitialHandler.access$100(ServletInitialHandler.java:81)
	at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:138)
	at io.undertow.servlet.handlers.ServletInitialHandler$2.call(ServletInitialHandler.java:135)
	at io.undertow.servlet.core.ServletRequestContextThreadSetupAction$1.call(ServletRequestContextThreadSetupAction.java:48)
	at io.undertow.servlet.core.ContextClassLoaderSetupAction$1.call(ContextClassLoaderSetupAction.java:43)
	at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
	at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
	at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
	at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
	at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
	at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
	at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:272)
	at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81)
	at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:104)
	at io.undertow.server.Connectors.executeRootHandler(Connectors.java:202)
	at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:805)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at java.lang.Thread.run(Thread.java:745)
Caused by: java.util.ConcurrentModificationException
	at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:901)
	at java.util.ArrayList$Itr.next(ArrayList.java:851)
	at org.demoiselle.jee.configuration.ConfigurationLoader.getValueFromSource(ConfigurationLoader.java:373)
	... 73 more

Search

Quando usamos o tipo UUID as buscas retornam
"Parameter value [1] did not match expected type [java.util.UUID (n/a)]"],"error":"Não foi possível consultar"}

demoiselle-security

Módulo de segurança, contexto de segurança, especialização JWT e Token

  • implementar retornos 401, não autenticado, e 403 não autorizado

Parents e BOM

Criação dos parents e BOM:

  • demoiselle-parent
  • demoiselle-parent-bom
  • demoiselle-parent-rest

Tratamento de Exceções

Implementar e documentar o tratamento de exceções do framework utilizando o padrões definidos internamente.

Infra do sourceforge instável

Sugiro estudar a possibilidade de abandonar a infra do sourceforge para servir os componentes Maven. O sourceforge está respirando com ajuda de aparelhos e pode não ser confiável.

Meu build hoje começou a falhar com a seguinte mensagem de erro:

Failed to transfer file: http://demoiselle.sourceforge.net/repository/release/
br/gov/frameworkdemoiselle/component/demoiselle-validation/2.0.0/
demoiselle-validation-2.0.0.pom.
Return code is: 503

Se tentarmos acessar o "repositório" indicado no README, obtemos o mesmo código 503 (conforme esperado):

$ curl -i http://demoiselle.sourceforge.net/repository/release
HTTP/1.1 503 Service Unavailable
Server: BigIP
Content-Length: 5892
Date: Tue, 21 Jul 2015 20:28:18 GMT

Provedor Http para o Front-end

Implementar provedor Http Angular2 que permite a configuração das requisições para o backend, adicionando cabeçalhos e lendo a URL do backend de acordo com a configuração.

Permitir configuração e uso de multiplos servidores de backend.

Erro na classe org.demoiselle.jee.security.filter.CorsFilter

Criamos um projeto demoiselle usando o gerador do yeoman que o framework disponibiliza. Para isso seguimos os passos descritos no endereço (https://github.com/demoiselle/framework-documentation/blob/master/generator-demoiselle.md), sendo que foi gerado dois projetos: o frontend e o backend.

Para efeitos de teste, rodamos o frontend com o webpack (npm start) e o backend no jboss eap 7, que é o servidor de aplicação usado nos nossos servidores.

Como eles estão rodando em servidores diferentes, os endereços para acessá-los também são diferentes, sendo que o frontend roda na porta 7070 e o jboss eap na porta 8080.

Sendo que quando entramos na página inicial, a aplicação é carregada normalmente, mas ao acessar o menu de usuários a aplicação percebe que o usuário não está logado no sistema e redireciona para a pagina de login.

Nesse ponto que ocorre o problema, pois quando o usuário tenta logar a aplicação faz uma requisição do tipo post para o servidor mas o navegardor detecta que o endereço desta requisição é diferente da requisição original e é preciso ser feito uma requisição cors preflight, ou seja, antes de enviar a requisição post, o navegador envia uma requisição do tipo OPTIONS para determinar se é seguro enviar o request e isso causa uma falha na classe org.demoiselle.jee.security.filter.CorsFilter, mais precisamente na linha 47. Pelo que percebemos, nessa linha o framework usa a classe ResourceInfo da especificação jax-rs, que representa a classe e o método que está sendo interceptado, mas como a requisição atual não possui um método alvo a ser interceptado ele acaba lançando uma org.jboss.resteasy.spi.UnhandledException.

Localização de método para tratamento de exceção: Tratamento para superclasses

Atualmente o framework seleciona o método para tratamento de exception (anotado com @ExceptionHandler) pelo nome da classe da exception, considerando apenas seu nível na hierarquia.
Por exemplo, se eu tiver o seguinte handler:

@br.gov.frameworkdemoiselle.exception.ExceptionHandler
public void exceptionHandler(Exception e) {
//impl
}

A única exceção tratata será Exception, sem considerar suas subclasses. Se eu quiser tratar uma NullPointerException, por exemplo, teria que escrever outro método específico.

Sugiro que seja alterada a implementação da busca do método para tratamento de exceção, considerando não apenas o método que trata a classe da exception, mas também suas superclasses.
Segue sugestão de implementação, na classe ExceptionHandlerInterceptor, alterando o método getMethod:

private final Method getMethod(final Class type, final Class exceptionClass) {
if (!cache.containsKey(type) || exceptionClass == null) {
return null;
} else if (cache.get(type).containsKey(exceptionClass)) {
return cache.get(type).get(exceptionClass);
} else {
return getMethod(type, exceptionClass.getSuperclass());
}
}

Dessa forma, se não for encontrado um handler específico para a exceção lançada, será utilizado o primeiro handler de sua hierarquia de superclasses, em abordagem bottom-up.

ExceptionMapper, sendo interrompido um NullPointer de Crud

Pessoal, criei um exceptionMapper, para minha exceção (herda RuntimeException);
nela eu seto o status code e coloco um entidade simples.
package br.gov.serpro.smartcert.exception;

import javax.ws.rs.core.Response;
import javax.ws.rs.ext.ExceptionMapper;
import javax.ws.rs.ext.Provider;

@Provider
public class SmartCertExceptionMapper implements ExceptionMapper {

@Override
public Response toResponse(SmartCertException exception) {        
    int status = exception.getStatus();
    ErrorMsg entity = new ErrorMsg();
    entity.msg= exception.getMsg();
    entity.debbug= (exception.getMessage()!=null)?exception.getMessage():"";   
    return Response.status(status).entity(entity).type("application/json").build();
}    
public final class ErrorMsg{
	public String msg = "";
	public String debbug = "";
}  

}
Ai quando rodo a aplicacao e lanco a excecao no BC. Sobe este erro no jboss:

17:11:59,390 ERROR [io.undertow.request] (default task-2) UT005023: Exception handling request to /smartcert-api/api/dispositivos/1/certificados: org.jboss.resteasy.spi.UnhandledException: java.lang.NullPointerException
at org.jboss.resteasy.core.SynchronousDispatcher.writeException(SynchronousDispatcher.java:187)
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:418)
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:209)
at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:221)
at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56)
at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:51)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:85)
at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at io.undertow.servlet.handlers.security.SSLInformationAssociationHandler.handleRequest(SSLInformationAssociationHandler.java:131)
dSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
at io.undertow.servlet.api.LegacyThreadSetupActionWrapper$1.call(LegacyThreadSetupActionWrapper.java:44)
at io.undertow.servlet.handlers.ServletInitialHandler.dispatchRequest(ServletInitialHandler.java:272)
at io.undertow.servlet.handlers.ServletInitialHandler.access$000(ServletInitialHandler.java:81)
at io.undertow.servlet.handlers.ServletInitialHandler$1.handleRequest(ServletInitialHandler.java:104)
at io.undertow.server.Connectors.executeRootHandler(Connectors.java:202)
at io.undertow.server.HttpServerExchange$1.run(HttpServerExchange.java:805)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException
at org.demoiselle.jee.crud.pagination.PaginationHelper.buildAcceptRange(PaginationHelper.java:244)
at org.demoiselle.jee.crud.pagination.PaginationHelper.buildAcceptRangeWithResponse(PaginationHelper.java:341)
at org.demoiselle.jee.crud.pagination.PaginationHelper$Proxy$_$$WeldClientProxy.buildAcceptRangeWithResponse(Unknown Source)
at org.demoiselle.jee.crud.CrudFilter.filter(CrudFilter.java:134)
at org.demoiselle.jee.crud.CrudFilter$Proxy$
$$_WeldClientProxy.filter(Unknown Source)
at org.jboss.resteasy.core.ServerResponseWriter.executeFilters(ServerResponseWriter.java:121)
at org.jboss.resteasy.core.ServerResponseWriter.writeNomapResponse(ServerResponseWriter.java:48)
at org.jboss.resteasy.core.SynchronousDispatcher.writeException(SynchronousDispatcher.java:183)
... 44 more

NullPointerException por causa de SQLException em que o SQLState == null

Estamos tomando NullPointerException no ExceptionTreatmentImpl.getFormatedError() por causa de uma SQLException em que o SQLState == null.

UT005023: Exception handling request to /ctma/api/teste: java.lang.NullPointerException
at java.util.concurrent.ConcurrentHashMap.putVal(ConcurrentHashMap.java:1011) [rt.jar:1.8.0_121]
at java.util.concurrent.ConcurrentHashMap.put(ConcurrentHashMap.java:1006) [rt.jar:1.8.0_121]
at org.demoiselle.jee.rest.exception.treatment.ExceptionTreatmentImpl.getFormatedError(ExceptionTreatmentImpl.java:123
...

Usamos banco de dados Oracle 12c com ojdbc7.

Consegui contornar o problema com uma alteração no método getSQLExceptionInException() para retornar a exceção apenas se o SQLState != null.
Caso getCause() seja nulo ou igual à exceção, então cria uma SQLException com um valor qualquer para o SQLState.
É preciso continuar procurando pois havia várias camadas de SQLException com SQLState == null até chegar na SQLException que de fato possuía SQLState.
Outra possibilidade seria corrigir o próprio getFormatedError() para evitar um map.put(null).

/**
 * This method return SQL Exception in stack of Exceptions (if exists), or null.
 *
 * @param ex
 *            Exception
 * @return SQLException or null
 */
private SQLException getSQLExceptionInException(Throwable ex) {
	Throwable current = ex;
	do {
		if (current instanceof SQLException) {
			SQLException sqlex = (SQLException) current;
			if (sqlex.getSQLState() != null) {
				return sqlex;
			}
			if (sqlex.getCause() == null || sqlex.getCause() == sqlex) {
				return new SQLException(sqlex.getMessage(), "0000", sqlex);
			}
		}
		current = current.getCause();
	}
	while (current != null);
	return null;
}

Erro a rodar qualquer projeto.

Vários desenvolvedores estão recebendo o mesmo Erro. Algém pode nos ajudar

[br.gov.frameworkdemoiselle.exception] (http-localhost/127.0.0.1:8080-2) Tratando a exceção org.jboss.weld.exceptions.WeldException

Discussões 3.0 - Front-end

Olá pessoal, convido todos e participar das discussões sobre a nova versão do Framework Demoiselle.

Essa issue trata o tema Frontend, que tem ganho destaque, e será tratada como um projeto Demoiselle. Queremos ouvi-los sobre as tecnologias que podem nos ajudar a construir interfaces que possam melhorar a experiência dos nossos usuários.

Vide vídeo: https://youtu.be/bP72IQEQzhU

Deixe aqui suas expectativas e comentários sobre o assunto.

Permitir inclusão de chaves de segurança nas propriedades do sistema

Atualmente o Demoiselle recupera as configurações de segurança do arquivo demoiselle.properties.
Para dois parâmetros, em especial, é desejável cadastrar os valores nas propriedades do sistema:
demoiselle.security.jwt.publicKey e demoiselle.security.jwt.privateKey.
Dessa forma é possível variar as chaves por ambiente, e os desenvolvedores não têm acesso às chaves em produção.

Desabilitar a segurança

Senhores,

O componente de segurança (autenkus) exige cookies e saml para funcionar corretamente, porém em tempo de desenvolvimento é extremamente trabalhoso.

Na versão 2.5 do demoiselle tínhamos a propriedade demoiselle.security.enabled=false para nos salvar.

Por favor, implementar algo semelhante na versão 3.x

Desde já agradeço.

Busca @Search em Classes Herdadas

Melhorar mecanismo de busca em classes herdadas para situações de alta concorrência. Em testes de performance foi encontrado problemas no retorno da busca.

Socket Closed on call render method from FileRendererImpl

When try to render a report with the Demoiselle Reports API, sometimes comes the error Socket Closed, this error can be resolved by changing the

@Inject
private HttpServletResponse response;

for

HttpServletResponse response = (HttpServletResponse) FacesContext.getCurrentInstance().getExternalContext().getResponse();

in the FileRendererImpl class

Configuration: prefixo default demoiselle

Ao criar uma classe de configuração sem prefixo ele usa o default como demoiselle, o que aconterá muito raramente pois estas sao configurações customizadas das aplicacoes.

Sugiro manter o default como "", pois demorei para descobrir que o config nao lia minhas propriedades pois estava buscando por demoiselle.minhaPropriedade

BookmarkBCTest falha ao ser executado com profile glassfish3

O teste unitário BookmarkBCTest falha ao ser executado com o profile para GlassFish 3:

$ mvn test -Pglassfish3
...
Results :

Tests in error:
br.gov.frameworkdemoiselle.sample.business.BookmarkBCTest: Exception List with 1 exceptions:

Tests run: 1, Failures: 0, Errors: 1, Skipped: 0

[INFO] ------------------------------------------------------------------------
[INFO] BUILD FAILURE
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 4.689s
[INFO] Finished at: Wed Oct 31 14:56:52 BRST 2012
[INFO] Final Memory: 21M/213M
[INFO] ------------------------------------------------------------------------
...
$

Discussões 3.0 - JEE

Olá pessoal convido todos e participar das discussões sobre a nova versão do Framework Demoiselle.

A versão 3.0 do Demoiselle visa atender necessidades de modernização e eficiência. Assuntos como: Java 8, servidores de aplicação JEE7, uso de Microcontainers, Multitenancy entre outros, são temas presentes nas novas linhas de desenvolvimento.

Vide vídeo: https://youtu.be/bP72IQEQzhU

Deixe aqui suas expectativas e comentários sobre o assunto.

Busca - @Search

Mecanismo de Busca na camada Rest - implementado no módulo CRUD.

Como desenvolver desejo funcionalidades para facilitar a implementação de buscas em recursos que utilizam o CRUD.

Annotation @Search

  • Pode ser utilizada apenas em escopo de métodos que retornem a interface Result;

Essa annotation é responsável por:

  • filtro (busca igual)
    • filtro de primeiro nível
    • filtro de segundo nível
  • pesquisa (likes) - Cancelado nesta release
  • ordenação
  • update (fulll, parcial) - Movido para issue #37
  • fields (retorno dos campos)
    • fields de primeiro nível
    • fields de segundo nível
  • filtro de campos de entrada e retorno baseado no atributo fields do @Search

Detalhamento

  • Usado na camada Rest @Search(fields={"nome", "cpf"})
  • O atributo fields é obrigatório
  • No AbstractREST, não terá @Search e nem a listagem visando não expor dados sensíveis
  • O método find deve ser implementado na camada REST da aplicação.
  • É possível filtrar e retornar apenas campos que estão no atributo fields

Exemplos de requisições de busca

  • "api/recurso?fields=" - campos de retorno
  • "api/recurso?sort=&order=" - ordenação
  • "api/recurso?salario=1000&nome=maria,jose,odair"
  • filtro com campos sensíveis (salário)
    • o retorno deve ser "bad request"
  • "api/recurso?range=" - a paginação é tratada na issue #53
  • "api/recurso?fields=salario,endereco(id,logradouro)"

demoiselle-rest

Módulo com facilitadores de uso para apps Restful

validation payload

  • Padrão de Mensagens - validação de campos
  • ExceptionMapper
  • Revisão de código

Null Pointer Exception

Na classe AbstractDAO, o método getMaxResult() não verifica se um atributo OU outro está nulo, ele apenas verifica se os dois estão nulos.

É necessário validar individualmente o Limit e o Offset:

método Original:

private Integer getMaxResult() {
        if (drc.getLimit() == null && drc.getOffset() == null) {
            return paginationConfig.getDefaultPagination();
        }

        return (drc.getLimit() - drc.getOffset()) + 1;
}

Método sugerido:

private Integer getMaxResult() {
        if (drc.getLimit() == null && drc.getOffset() == null) {
                return paginationConfig.getDefaultPagination();
        }
        if (drc.getLimit() == null) {
	        drc.setLimit(0);
         }
        if (drc.getOffset() == null) {
		drc.setOffset(0);
	}
	return (drc.getLimit() - drc.getOffset()) + 1;
}

Definição de Build

Criar nova estrutura de build para publicação na sonatype.

  • Mudança de domínio para demoiselle.org
  • Acesso ao time para publicação
  • Definição do pom.xml
  • Documentação gitbook

Search

Usar a anotação com @Search(fields = {"*"}, withPagination = false)
e fazer sort da a seguinte mensagem
O campo 'descrition' solicitado na requisição não está habilitado em @Search(fields=...)"

Build "dry-run" nao funciona

Logo após efetuar o clone do repositorio, tentei compilar o projeto com o comando $ mvn install, e o seguinte erro aconteceu:

[ERROR] The build could not read 1 project -> [Help 1]
[ERROR]
[ERROR] The project br.gov.frameworkdemoiselle:demoiselle-se-parent:2.3.0-SNAPSHOT (/home/bruno/Work/workspaces/demoiselle/framework/parent/se/pom.xml) has 1 error
[ERROR] Non-resolvable parent POM: Failure to find br.gov.frameworkdemoiselle:demoiselle-extension-parent:pom:2.3.0-SNAPSHOT in https://oss.sonatype.org/content/repositories/snapshots was cached in the local repository, resolution will not be reattempted until the update interval of sonatype-nexus-snapshots has elapsed or updates are forced and 'parent.relativePath' points at wrong local POM @ line 44, column 10 -> [Help 2]
[ERROR]
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.
[ERROR]
[ERROR] For more information about the errors and possible solutions, please read the following articles:
[ERROR] [Help 1] http://cwiki.apache.org/confluence/display/MAVEN/ProjectBuildingException
[ERROR] [Help 2] http://cwiki.apache.org/confluence/display/MAVEN/UnresolvableModelException

LifeCycle

  • Definir LifeCycle da aplicação.
  • inicialização
  • Finalização

Upload de arquivo

Prezados,

Existe algum exemplo de como realizar upload de arquivo?
O upload do arquivo deve acontecer no POST juntamente com diversos outros campos.

JPACrud.createCriteriaByExample does not work as expected

No demoiselle 2.3.1, a classe JPACrud implementa o seguinte método:

private CriteriaQuery createCriteriaByExample(final T example) {
final CriteriaBuilder builder = getCriteriaBuilder();
final CriteriaQuery query = builder.createQuery(getBeanClass());
final Root entity = query.from(getBeanClass());

final List predicates = new ArrayList();
final Field[] fields = example.getClass().getDeclaredFields();

for (Field field : fields) {
if (!field.isAnnotationPresent(Column.class) && !field.isAnnotationPresent(Basic.class)
&& !field.isAnnotationPresent(Enumerated.class)) { continue; }

Object value = null;

try
{ field.setAccessible(true); value = field.get(example); }

catch (IllegalArgumentException e)
{ continue; } catch (IllegalAccessException e) { continue; }

if (value == null)
{ continue; }

final Predicate pred = builder.equal(entity.get(field.getName()), value);
predicates.add(pred);
}

return query.where(predicates.toArray(new Predicate[0])).select(entity);
}

No trecho em negrito, poderia ser incluída a anotação JoinColumn.

Criação do mecanismo para seguraça baseado em URLMapping

Possibilitar que o desenvolvedor possa escolher entre o mecanismo atual de restrição de acesso baseado na anotação @authentication e um mecanismo baseado em mapeamento por URL.

Ex:
Arquivo demoiselle-security.propreties

demoiselle.security.mechanism.type=URL_MAPPING # ou ANNOTATION
demoiselle.security.url_mapping = [
    '*'          : 'all',
    '/products : 'ROLE_USERS, ROLE_X, ROLE_ADMIN',
    '/products/edit/* : 'ROLE_ADMIN',
    ......
]

Implementar pesquisa simples (um argumento para mais de um campo)

Por exemplo, seu eu pesquiso 'fulano', o sistema deve pesquisar nos campos 'nome', 'email', etc... Sugiro que a pesquisa simples faça uma varredura em todos os campos pela string ou pelos campos que forem passados como parâmetro.

Então, algo desse tipo:

http://localhost:8080/api/users?name||email=fulano

deve retornar:

[{"id":1,"name":"Fulano", "email": "[email protected]"}, {"id":1,"name":"Ciclano", "email": "[email protected]"}]

Possibilitar o consumo de múltiplas fontes para @Configuration

Atualmente a anotação @configuration aceita o consumo de apenas uma única fonte por vez (XML, PROPERTIES ou SYSTEM).

É interessante que essa anotação pudesse receber uma ordem de fontes a serem consumidas, por exemplo:

@Configuration(types={PROPERTIES, SYSTEM}) // 1º Properties, 2º Variáveis de Ambiente
public class MyConfig { ... }

O mecanismo carregaria primeiramente as configurações que ele encontrasse no arquivo de propriedades (PROPERTIES) preenchendo os campos encontrados e na sequência procuraria nas variáveis de ambiente (SYSTEM) valores que podem substituir o que foi definido em PROPERTIES.

Essa abertura facilitaria a troca de valores como chave de segurança, senhas, etc. em um ambiente de produção sem a necessidade do desenvolvedor ficar trocando os arquivos de configuração no momento da geração de uma nova versão para a produção.

Integração SSO Keycloak com Demoiselle

Pessoal,

Na minha organização usamos o Keycloak para autenticação e autorização. O Keycloak, é uma solução open source que implementa o conceito de SSO.

Como posso integrar o SSO é aproveitar as anotações de segurança do projeto Security?

Atenciosamente,

Iury

Módulo de segurança para o front-end

Desenvolver módulo de segurança Angular2 com as seguintes características:

  • Serviços de autenticação utilizando JWT
  • Diretivas de segurança que apresentam conteúdo de acordo com roles, autenticado/não autenticado
  • Serviço AuthGuard que permite configuração das rotas de acordo com a autenticação

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.