demoiselle / framework Goto Github PK
View Code? Open in Web Editor NEWRepositório principal contendo o Core e Extensions: JPA, Security, WS
Home Page: https://demoiselle.org
Repositório principal contendo o Core e Extensions: JPA, Security, WS
Home Page: https://demoiselle.org
Desenvolver módulo de segurança Angular2 com as seguintes características:
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
Criação dos parents e BOM:
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;
}
Criar o mecanismo de paginação sugerido pelo artigo http://blog.octo.com/pt-br/projetando-uma-api-rest/#pagination.
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
Gestão de tokens baseados em lista na memória
Definição da utilização do módulo de persistência do framework.
Criar nova estrutura de build para publicação na sonatype.
Uso do padrão JWT (https://jwt.io/), com troca de chaves, exemplo em (https://github.com/demoiselle/example-store/tree/master/backend/auth)
(https://cep-fwkdemoiselle.rhcloud.com)
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
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"}
Prezados,
Existe algum exemplo de como realizar upload de arquivo?
O upload do arquivo deve acontecer no POST juntamente com diversos outros campos.
Módulo de segurança, contexto de segurança, especialização JWT e Token
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.
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.
Implementar a operação patch no crud seguindo a especificação http://blog.octo.com/en/design-a-rest-api/
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=...)"
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.
Ao anotar um campo com @ignore o mecanismo de impressão de valores imprime o campo e valor que deveriam ser ignorados.
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.
Implementar e documentar o tratamento de exceções do framework utilizando o padrões definidos internamente.
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]"}]
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] ------------------------------------------------------------------------
...
$
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.
Melhorar a construção dinâmica das consultas para filtrar apenas os campos solicitados pela camada REST.
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',
......
]
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.
Onde algo desse tipo:
http://localhost:8080/api/users?name%fulano
deve retornar:
[
{"id":1,"name":"Fulano da Silva", "email": "[email protected]"},
{"id":1,"name":"Ciclano Fulano", "email": "[email protected]"},
{"id":1,"name":"Fulanous Marvelous", "email": "[email protected]"},
]
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
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.
Essa annotation é responsável por:
fields
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.
Módulo com facilitadores de uso para apps Restful
validation payload
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.
Falta:
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
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;
}
Validação baseada em em banco
O demoiselle-configuration permite popular campos do tipo Map, porém quando se tem uma classe com @Configuration e um prefixo setado o campo de Map não esta sendo populado.
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.
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
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
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.
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
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.