Bienvenido a Java Mexico

Java México es una comunidad de desarrolladores mexicanos en el lenguaje Java.

Este sitio es colaborativo, automáticamente al registrarte obtienes un Blog para compartir tus conocimientos o información acerca del lenguaje. Antes de publicar en tu blog o los foros por favor lee los lineamientos de publicación.

Para dudas y problemas con respecto al lenguaje Java puedes visitar los Foros de Discusión.

¿Eres nuevo? ¿Cómo hacer que tus preguntas tengan mas posibilidades de ser respondidas?

Es normal que un usuario al tener un problema con algún programa quiera obtener ayuda de la comunidad y se disponga a escribir en algunos de los foros. Pero, ¿Que pasa cuando al crear el tema este queda como si hubiera sido escrito por un niño de 5 años?
Aquí daré unos tips sobre como hacer que tu pregunta tenga mas chance de ser respondida, mas rápido y con mas ganas de ayudarte por parte de la comunidad.
El mismo propósito de este tema puede parecer innecesario y/o inservible, por varias razones. Pero hay un motivo que me impulsa a hacerlo: me he dado cuenta de que la mayoría de las personas no saben como redactar una pregunta.

Queries Dinámicos en Spring Data JPA

Tuve la necesidad de crear un Query de forma dinámica con JPA, pues tenía varios métodos definidos y podrían crecer mas, algo así:

QuestionRepository.groovy

interface QuestionRepository extends PagingAndSortingRepository<Question,Long> {
  List<Question> findAllByAuthorAndEnabledAndStatusInAndParentIsNull(UserGE author,Boolean enabled,List<String> statuses, Pageable pageable)
  List<Question> findAllByCampus_CodeLikeAndSubject_subjectNumberLikeAndTypeLikeAndCareer_codeLikeAndUnityLikeAndComplexityLikeAndAuthorAndEnabledAndStatusInAndParentIsNull(String campusCode, String subjectNumber, String type, String careerCode, String unity, String complexity, UserGE author, Boolean enabled,List<String> statuses, Pageable pageable)
  long countByAuthorAndEnabledAndStatusInAndParentIsNull(UserGE author,Boolean enabled,List<String> statuses)
  long countByCampus_CodeLikeAndSubject_subjectNumberLikeAndTypeLikeAndCareer_codeLikeAndUnityLikeAndComplexityLikeAndAuthorAndEnabledAndStatusInAndParentIsNull(String campusCode, String subjectNumber, String type, String careerCode, String unity, String complexity,UserGE author, Boolean enabled,List<String> statuses)

Aplicar AOP con JavaConfig (AspectJExpressionPointcut)

Hace poco me toco tocar un componente en dónde tuve que aplicar un aspecto, la última vez que lo hice lo configuré con el namespace de AOP de Spring, pero estz vez quise hacerlo todo con JavaConfig; he aquí lo que hice:

El XML era este:

<bean id="monitoringAdvice" class="net.bull.javamelody.MonitoringSpringInterceptor" />
<aop:config>
  <aop:pointcut expression="execution(* com.makingdevs.service..**.*(..))"
    id="monitoringPointcut" />
  <aop:advisor advice-ref="monitoringAdvice" pointcut-ref="monitoringPointcut" />
</aop:config>

TableView en JavaFX

Buenas tardes, tengo un problema al usar las Table View, soy nuevo en Javafx, y apenas estoy aprendiendo, casi todo es más sencillo que con Swing, bueno, el problema es el siguiente
El problema es que estoy usando Scene Builder, esto ya es un proyecto grande, y necesito tener visualizaciones de las ventanas

Proyecto p = new Proyecto("1", "Proyecto A", "Proyecto chido"); //Esto es solo una prueba, se supone que lo jalará de la BD
        ObservableList<Proyecto> ListaProyectos = FXCollections.observableArrayList(p, p, p);        
        TCIDProy.setCellValueFactory(new PropertyValueFactory<Proyecto, String>("IDProyecto"));
        TCProy.setCellValueFactory(new PropertyValueFactory<Proyecto, String>("Nombre"));      
        TPrincipal.getItems().addAll(ListaProyectos);

El resultado de ese código es una tabla que arroja esto StringProperty[Value:1] en vez de arrojar simplemente un "1". No se en que me estoy equivocando, he investigado y casi todos lo hacen a mano, y en el caso de este proyecto no es viable cambiarlo a mano.

WEBSERVICE Y ACCESO A BASE DE DATOS

Cuando hablamos o estudiamos WebServices nos aparece una infinidad de métodos y tecnologías desde los benditos WSDL, pasando por JSON, AXIS, SOAP, RPC y un largo etcétera. Si le sumamos a ello el acceso a base de datos y sus respectivas transacciones, la cosa se complica mas. Para ello, benévolamente, las grandes empresas tecnológicas nos ofrecen una y otra y otra más abstracción para que el desarrollo sea mas intuitivo y fácil de actualizar. Pero la pregunta del millón es: de verdad es más intuitivo y fácil de actualizar, además de rápido? Si ya todo esto tiene su problemática y su discusión aparece en la escena de esta tragicomedia tecnológica las aplicaciones móviles. Vemos todo tipo de aplicaciones móviles, miles, millones. Sin embargo, muy pocas apps son herramientas transaccionales/administrativas. Tenemos apps sociales, de multimedia, juegos, herramientas de productividad, editores, información, etc..

Instalando Jenkins

Jenkins, al igual que Docker, se han vuelto una moda. Una moda que, tarde o temprano, todo desarrollador tendrá que usar.

Jenkins promete cosas como:

  • Control de versiones de tu código.
  • Construcción automática.
  • Controlar y monitorear procesos
  • y muchas otras cosas más.
  • Lo primero que hay que hacer es bajarlo.

    Instalarlo es relativamente fácil. Debemos ubicarnos en la carpeta donde este el archivo jenkins.war y desde una terminal teclear:
    java -jar jenkins.war

    Al instalarse se genera una clave que tendrás que usar. Copiamos esa clave.

    Abrimos un navegador en la URL: http://localhost:8080

    Pegamos la clave que vemos en la terminal y damos clic en Continuar (o Continue).

recomendaciones para establecer relaciones en gorm

buenas noches a esta gran comunidad de programadores, para no entrar en detalles necesito de su ayuda ya que tengo una duda sobre que enfoque elegir para un proyecto en grails - gorm basicamente la duda es esta:

una empresa debe pertenecer a una sola categoria.

y tengo dos opciones:
Opcion A

class Empresa {
/* atributos */
 Categoria categoria

}
class Categoria {
 String nombre
}

Opcion B

class Categoria {
    String nombre
    static hasMany = [empresas: Empresa]
}
class Empresa {
   /*atributos*/

}

cual seria la mejor alternativa?de antemano les estare agradecido

Video de aguacate

Hice un video donde se puede ver el funcionamiento de aguacate, mostrando como se modifica un servicio REST, donde no se requiere compilar y/o reiniciar el proceso.

https://www.youtube.com/watch?v=HnibfIoj3bU

https://www.youtube.com/watch?v=WBrEmeT2J-8

Aguacate

Espero que no viole reglas y/o normas

Estoy trabajando en un proyecto opensource propio. Aun esta en beta, pero ya es bastante funcional

La intencion es crear una aplicación, para desplegar servicios REST-CRUD (por el momento) sin necesidad de reinstalar-recompilar-redeployar la aplicación, mediante la externalización de la lógica de negocio. Dejo la liga a la pagina y me gustaria ver que piensan de dicha aplicación

    https://github.com/mcnew/aguacate-swagger-demo

P.D.: Notese que aun tiene algunos bugs, pero de menos ya no se cae y el rendimiento es bastante decente.

Saludos y gracias

Configuración de Spring Security dinámica

Estimados buen día, espero se encuentren muy bien, espero que alguno de ustedes me pueda orientar, resulta que necesito crear una configuración dinámica de seguridad con Spring Security, conozco muy poco del framework y por lo poco que he trabajado en el, recuerdo que cuando se configura la seguridad HttpSecurity se asigna los accesos para cada ROL y sobre que puede acceder cada uno de los roles de usuario, pero ahora resulta que se requiere que esta configuración que hasta donde tengo entendido cuando inicia el deploy de la aplicación se inicializa la configuración de la seguridad y esta se queda de manera estática dentro de la aplicación y esta es cambiada una vez que la aplicación es reiniciada, entonces me surge la duda de como se podría hacer para que esta configuración sea dinámica y se pudiera modificar en tiempo de ejecución para agregar,editar y hasta eliminar roles y permisos sin la necesidad de realizar un reinicio en el aplicativo.

Distribuir contenido