Skip to content

Image Upload

Daniel Cortes Pichardo edited this page Oct 19, 2017 · 3 revisions

Ejemplo de CRUD para guardar imagenes

Tabla Usuario

CREATE TABLE IF NOT EXISTS usuario(
    id BIGINT DEFAULT nextval('seq_usuario'),
    nombre VARCHAR(255) NOT NULL,
    imagen BLOB,
    imagen_content_type VARCHAR(255),
    constraint pk_usuario primary key (id)
);

Los archivos que implementan el CRUD para la tabla anterior son:

new file:   src/main/java/mx/infotec/dads/rsr/domain/Usuario.java
new file:   src/main/java/mx/infotec/dads/rsr/repository/UsuarioRepository.java
new file:   src/main/java/mx/infotec/dads/rsr/service/UsuarioService.java
new file:   src/main/java/mx/infotec/dads/rsr/service/impl/UsuarioServiceImpl.java
new file:   src/main/java/mx/infotec/dads/rsr/web/rest/UsuarioResource.java
new file:   src/main/webapp/app/entities/usuario/usuario-delete-dialog.controller.js
new file:   src/main/webapp/app/entities/usuario/usuario-delete-dialog.html
new file:   src/main/webapp/app/entities/usuario/usuario-detail.controller.js
new file:   src/main/webapp/app/entities/usuario/usuario-detail.html
new file:   src/main/webapp/app/entities/usuario/usuario-dialog.controller.js
new file:   src/main/webapp/app/entities/usuario/usuario-dialog.html
new file:   src/main/webapp/app/entities/usuario/usuario.controller.js
new file:   src/main/webapp/app/entities/usuario/usuario.search.service.js
new file:   src/main/webapp/app/entities/usuario/usuario.service.js
new file:   src/main/webapp/app/entities/usuario/usuario.state.js
new file:   src/main/webapp/app/entities/usuario/usuarios.html
new file:   src/main/webapp/i18n/en/usuario.json
new file:   src/main/webapp/i18n/es/usuario.json

A continuación se muestra el detalle de cada uno

Back-End (Java)

Usuario.java

archivo src/main/java/mx/infotec/dads/rsr/domain/Usuario.java

/*
 *  
 * The MIT License (MIT)
 * Copyright (c) 2017 KUKULKAN
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */
package mx.infotec.dads.rsr.domain;

import java.lang.Long;
import javax.persistence.*;
import javax.validation.constraints.*;
import java.io.Serializable;
/**
 * The Usuario
 * 
 * @author KUKULKAN
 *
 */
@Entity
@Table(name = "USUARIO")
public class Usuario implements Serializable {
    private static final long serialVersionUID = 1L;

    /**
     * Este campo fue generado automaticamente por KUKULKAN 
     * Este campo corresponde a la llave primaria id
     *
     * @kukulkanGenerated 2017-10-19T16:48:30Z
     */
    @Id
    @SequenceGenerator(name = "SEQ_USUARIO", sequenceName = "SEQ_USUARIO", allocationSize=100)
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "SEQ_USUARIO")
    @Column(name = "id", unique = true, nullable = false)
    private Long id;
	
    /**
     * Este campo fue generado automaticamente por KUKULKAN 
     * Este campo corresponde a la tabla USUARIO
     *
     * @kukulkanGenerated 2017-10-19T16:48:30Z
     */
    @Column(name = "IMAGEN")
    @Basic(fetch = FetchType.LAZY)
    @Lob
    private byte[] imagen;
	
    /**
     * Este campo fue generado automaticamente por KUKULKAN 
     * Este campo corresponde a la tabla USUARIO
     *
     * @kukulkanGenerated 2017-10-19T16:48:30Z
     */
    @Column(name = "IMAGEN_CONTENT_TYPE")
    private String imagenContentType;
	
    /**
     * Este campo fue generado automaticamente por KUKULKAN 
     * Este campo corresponde a la tabla USUARIO
     *
     * @kukulkanGenerated 2017-10-19T16:48:30Z
     */
    @NotNull
    @Column(name = "NOMBRE", nullable = false)
    private String nombre;
	
    /**
     * Este constructor fue generado automáticamente por KUKULKAN
     * 
     */
    public Usuario() {

    }
    
    /**
     * Este método fue generado automaticamente por KUKULKAN 
     * Este método GETTER fue generado para la llave primaria USUARIO.id
     *
     * @return el valor de id
     *
     * @kukulkanGenerated 2017-10-19T16:48:30Z
     */
    public Long getId() {
        return id;
    }

    /**
     * Este método fue generado automaticamente por KUKULKAN 
     * Este método SETTER fue generado para la llave primaria. USUARIO.id
     *
     * @return el valor de area_conocimiento.id
     *
     * @kukulkanGenerated 2017-10-19T16:48:30Z
     */
    public void setId(Long id) {
        this.id = id;
    }

    /**
     * Este método fue generado automaticamente por KUKULKAN 
     * Este método GETTER fue generado para la propiedad USUARIO.IMAGEN
     *
     * @return el valor de imagen
     *
     * @kukulkanGenerated 2017-10-19T16:48:30Z
     */
    public byte[] getImagen() {
        return imagen;
    }

    /**
     * Este método fue generado automaticamente por KUKULKAN 
     * Este método SETTER fue generado para la propiedad. USUARIO.imagen
     *
     * @return el valor de Imagen
     *
     * @kukulkanGenerated 2017-10-19T16:48:30Z
     */
    public void setImagen(byte[] imagen) {
        this.imagen = imagen;
    }
    /**
     * Este método fue generado automaticamente por KUKULKAN 
     * Este método GETTER fue generado para la propiedad USUARIO.IMAGEN_CONTENT_TYPE
     *
     * @return el valor de imagenContentType
     *
     * @kukulkanGenerated 2017-10-19T16:48:30Z
     */
    public String getImagenContentType() {
        return imagenContentType;
    }

    /**
     * Este método fue generado automaticamente por KUKULKAN 
     * Este método SETTER fue generado para la propiedad. USUARIO.imagenContentType
     *
     * @return el valor de ImagenContentType
     *
     * @kukulkanGenerated 2017-10-19T16:48:30Z
     */
    public void setImagenContentType(String imagenContentType) {
        this.imagenContentType = imagenContentType;
    }
    /**
     * Este método fue generado automaticamente por KUKULKAN 
     * Este método GETTER fue generado para la propiedad USUARIO.NOMBRE
     *
     * @return el valor de nombre
     *
     * @kukulkanGenerated 2017-10-19T16:48:30Z
     */
    public String getNombre() {
        return nombre;
    }

    /**
     * Este método fue generado automaticamente por KUKULKAN 
     * Este método SETTER fue generado para la propiedad. USUARIO.nombre
     *
     * @return el valor de Nombre
     *
     * @kukulkanGenerated 2017-10-19T16:48:30Z
     */
    public void setNombre(String nombre) {
        this.nombre = nombre;
    }

    /**
     * Este método fue generado automaticamente por KUKULKAN
     *
     * @return el valor de representado por la entidad Usuario
     *
     * @kukulkanGenerated 2017-10-19T16:48:30Z
     */
    @Override
    public String toString() {
        StringBuilder sb = new StringBuilder();
        sb.append(getClass().getSimpleName());
        sb.append(" [");
        sb.append("Hash = ").append(hashCode());
        sb.append(", imagen=").append(imagen);
        sb.append(", imagenContentType=").append(imagenContentType);
        sb.append(", nombre=").append(nombre);
        sb.append("]");
        return sb.toString();
    }
}

UsuarioRepository.java

archivo src/main/java/mx/infotec/dads/rsr/repository/UsuarioRepository.java

/*
 *  
 * The MIT License (MIT)
 * Copyright (c) 2017 KUKULKAN
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */
package mx.infotec.dads.rsr.repository;

import org.springframework.data.jpa.repository.JpaRepository;
import mx.infotec.dads.rsr.domain.Usuario;

/**
 * UsuarioRepository
 * 
 * @author KUKULKAN
 * @kukulkanGenerated 2017-10-19T16:48:30Z
 */
public interface UsuarioRepository extends JpaRepository<Usuario, Long> {

}

UsuarioService.java

archivo src/main/java/mx/infotec/dads/rsr/service/UsuarioService.java

/*
 *  
 * The MIT License (MIT)
 * Copyright (c) 2017 KUKULKAN
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */
package mx.infotec.dads.rsr.service;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;

import mx.infotec.dads.rsr.domain.Usuario;

/**
 * UsuarioService
 * 
 * @author KUKULKAN
 * @kukulkanGenerated 2017-10-19T16:48:30Z
 */
public interface UsuarioService {

    /**
     * regresa una lista con todos los elementos Usuario
     * 
     * @return Page<Usuario>
     */
    Page<Usuario> findAll(Pageable pageable);

    /**
     * Consulta un Usuario por su llave primaria
     * 
     * @param id
     * @return Usuario
     */
    Usuario findById(Long id);

    /**
     * Guarda o actualiza un Usuario
     * 
     * @param usuario
     * @return boolean
     */
    Usuario save(Usuario usuario);

    /**
     * Regresa true o false si existe un Usuario almacenado
     * 
     * @param id
     * @return boolean
     */
    boolean exists(Long id);

    /**
     * Borrar un Usuario por su llave primaria
     * 
     * @param id
     */
    void delete(Long id);

    /**
     * Borrar todos los elementos Usuario almacenados
     * 
     * @param id
     */
    void deleteAll();
    
    /**
     * Buscar Usuario con el correspondiente al query.
     *
     *  @param query El query de la busqueda
     *  
     *  @param pageable la información de paginación
     *  @return Page de todas las entidades
     */
    Page<Usuario> search(String query, Pageable pageable);
}

UsuarioServiceImpl.java

archivo src/main/java/mx/infotec/dads/rsr/service/impl/UsuarioServiceImpl.java

/*
 *  
 * The MIT License (MIT)
 * Copyright (c) 2017 KUKULKAN
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */
package mx.infotec.dads.rsr.service.impl;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import mx.infotec.dads.rsr.domain.Usuario;
import mx.infotec.dads.rsr.repository.UsuarioRepository;
import mx.infotec.dads.rsr.service.UsuarioService;

/**
 * UsuarioServiceImpl
 * 
 * @author KUKULKAN
 * @kukulkanGenerated 2017-10-19T16:48:30Z
 */
@Service
@Transactional
public class UsuarioServiceImpl implements UsuarioService {

    private final Logger log = LoggerFactory.getLogger(UsuarioServiceImpl.class);

    @Autowired
    private UsuarioRepository repository;

    @Override
    @Transactional(readOnly = true)
    public Page<Usuario> findAll(Pageable pageable) {
        log.debug("Request to get all Usuario");
        return repository.findAll(pageable);
    }

    @Override
    @Transactional(readOnly = true)
    public Usuario findById(Long id) {
        log.debug("Request to get Usuario : {}", id);
        return repository.findOne(id);
    }

    @Override
    public Usuario save(Usuario usuario) {
        return repository.save(usuario);
    }

    @Override
    public boolean exists(Long id) {
        return repository.exists(id);
    }

    @Override
    public void delete(Long id) {
        log.debug("Request to delete Usuario : {}", id);
        repository.delete(id);
    }

    @Override
    public void deleteAll() {
        log.debug("Request to delete All Usuario");
        repository.deleteAll();
    }
    
    @Override
    @Transactional(readOnly = true)
    public Page<Usuario> search(String query, Pageable pageable) {
        log.debug("Request to search for a page of Usuario ");
        return repository.findAll(pageable);
    }
}

UsuarioResource.java

archivo src/main/java/mx/infotec/dads/rsr/web/rest/UsuarioResource.java

/*
 *  
 * The MIT License (MIT)
 * Copyright (c) 2017 KUKULKAN
 *
 * Permission is hereby granted, free of charge, to any person obtaining a copy
 * of this software and associated documentation files (the "Software"), to deal
 * in the Software without restriction, including without limitation the rights
 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
 * copies of the Software, and to permit persons to whom the Software is
 * furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in all
 * copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
 * SOFTWARE.
 */
package mx.infotec.dads.rsr.web.rest;

import java.util.List;
import java.util.Optional;

import com.codahale.metrics.annotation.Timed;
import io.swagger.annotations.ApiParam;
import io.github.jhipster.web.util.ResponseUtil;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import javax.validation.Valid;
import java.net.URI;
import java.net.URISyntaxException;
import mx.infotec.dads.rsr.web.rest.util.HeaderUtil;
import mx.infotec.dads.rsr.web.rest.util.PaginationUtil;

import mx.infotec.dads.rsr.domain.Usuario;
import mx.infotec.dads.rsr.service.UsuarioService;
/**
 * 
 * @author KUKULKAN
 * @kukulkanGenerated 2017-10-19T16:48:30Z
 */

@RestController
@RequestMapping("/api")
public class UsuarioResource {

    private static final Logger log = LoggerFactory.getLogger(UsuarioResource.class);
    
    private static final String ENTITY_NAME = "usuario";

    @Autowired
    private UsuarioService service;
    
    /**
     * GET  /usuarios : recupera todos los usuarios.
     *
     * @param pageable información de paginación
     * @return El objeto ResponseEntity con estado de 200 (OK) y la lista de usuarios en el cuerpo del mensaje
     */
    @GetMapping("/usuarios")
    @Timed
    public ResponseEntity<List<Usuario>> getAllUsuario(@ApiParam Pageable pageable) {
        log.debug("REST request to get a page of Usuario");
        Page<Usuario> page = service.findAll(pageable);
        HttpHeaders headers = PaginationUtil.generatePaginationHttpHeaders(page, "/api/usuarios");
        return new ResponseEntity<>(page.getContent(), headers, HttpStatus.OK);
    }

    /**
     * GET  /usuarios/:id : recupera por "id" de Usuario.
     *
     * @param id el id del Usuario que se desea recuperar
     * @return El objeto ResponseEntity con el estado de 200 (OK) y dentro del cuerpo del mensaje el Usuario, o con estado de 404 (Not Found)
     */
    @GetMapping("/usuarios/{id}")
    @Timed
    public ResponseEntity<Usuario> getUsuario(@PathVariable Long id) {
        log.debug("REST request to get Usuario : {}", id);
        Usuario usuario = service.findById(id);
        return ResponseUtil.wrapOrNotFound(Optional.ofNullable(usuario));
    }

    /**
     * POST  /usuarios : Create a new usuario.
     *
     * @param usuario el usuario que se desea crear
     * @return El objeto ResponseEntity con estado 201 (Created) y en el cuerpo un nuevo usuario, o con estado 400 (Bad Request) si el usuario ya tiene un ID
     * @throws URISyntaxException Si la sintaxis de la URI no es correcta
     */
    @PostMapping("/usuarios")
    @Timed
    public ResponseEntity<Usuario> createUsuario(@Valid @RequestBody Usuario usuario) throws URISyntaxException {
        log.debug("REST request to save Usuario : {}", usuario);
        if (usuario.getId() != null) {
            return ResponseEntity.badRequest().headers(HeaderUtil.createFailureAlert(ENTITY_NAME, "idexists", "A new usuario cannot already have an ID")).body(null);
        }
        Usuario result = service.save(usuario);
        return ResponseEntity.created(new URI("/api/usuarios/" + result.getId()))
            .headers(HeaderUtil.createEntityCreationAlert(ENTITY_NAME, result.getId().toString()))
            .body(result);
    }
    
    /**
     * PUT  /usuarios : Actualiza un Usuario existente.
     *
     * @param usuario el usuario que se desea actualizar
     * @return el objeto ResponseEntity con estado de 200 (OK) y en el cuerpo de la respuesta el Usuario actualizado,
     * o con estatus de 400 (Bad Request) si el usuario no es valido,
     * o con estatus de 500 (Internal Server Error) si el usuario no se puede actualizar
     * @throws URISyntaxException si la sintaxis de la URI no es correcta
     */
    @PutMapping("/usuarios")
    @Timed
    public ResponseEntity<Usuario> updateUsuario(@Valid @RequestBody Usuario usuario) throws URISyntaxException {
        log.debug("REST request to update Usuario : {}", usuario);
        if (usuario.getId() == null) {
            return createUsuario(usuario);
        }
        Usuario result = service.save(usuario);
        return ResponseEntity.ok()
            .headers(HeaderUtil.createEntityUpdateAlert(ENTITY_NAME, usuario.getId().toString()))
            .body(result);
    }


    /**
     * DELETE  /usuarios/:id : borrar el Usuario con "id".
     *
     * @param id el id del Usuario que se desea borrar
     * @return el objeto ResponseEntity con estatus 200 (OK)
     */
    @DeleteMapping("/usuarios/{id}")
    @Timed
    public ResponseEntity<Void> deleteUsuario(@PathVariable Long id) {
        log.debug("REST request to delete Usuario : {}", id);
        service.delete(id);
        return ResponseEntity.ok().headers(HeaderUtil.createEntityDeletionAlert(ENTITY_NAME, id.toString())).build();
    }

    /**
     * SEARCH  /_search/usuarios?query=:query : buscar por el usuario correspondiente
     * to the query.
     *
     * @param query el query para el usuario que se desea buscar
     * @param pageable información de la paginación
     * @return el resultado de la busqueda
     */
    @GetMapping("/_search/usuarios")
    @Timed
    public ResponseEntity<List<Usuario>> searchUsuario(@RequestParam String query, @ApiParam Pageable pageable) {
        log.debug("REST request to search for a page of Usuario for query {}", query);
        Page<Usuario> page = service.search(query, pageable);
        HttpHeaders headers = PaginationUtil.generateSearchPaginationHttpHeaders(query, page, "/api/_search/usuarios");
        return new ResponseEntity<>(page.getContent(), headers, HttpStatus.OK);
    }
    
}

Front-End (Angular 1.5.8)

usuario-delete-dialog.controller.js

archivo src/main/webapp/app/entities/usuario/usuario-delete-dialog.controller.js

(function() {
    'use strict';

    angular
        .module('kukulkantestApp')
        .controller('UsuarioDeleteController',UsuarioDeleteController);

    UsuarioDeleteController.$inject = ['$uibModalInstance', 'entity', 'Usuario'];

    function UsuarioDeleteController($uibModalInstance, entity, Usuario) {
        var vm = this;

        vm.usuario = entity;
        vm.clear = clear;
        vm.confirmDelete = confirmDelete;

        function clear () {
            $uibModalInstance.dismiss('cancel');
        }

        function confirmDelete (id) {
            Usuario.delete({id: id},
                function () {
                    $uibModalInstance.close(true);
                });
        }
    }
})();

usuario-delete-dialog.html

archivo src/main/webapp/app/entities/usuario/usuario-delete-dialog.html

<form name="deleteForm" ng-submit="vm.confirmDelete(vm.usuario.id)">
    <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-hidden="true"
                ng-click="vm.clear()">&times;</button>
        <h4 class="modal-title" data-translate="entity.delete.title">Confirm delete operation</h4>
    </div>
    <div class="modal-body">
        <jhi-alert-error></jhi-alert-error>
        <p data-translate="kukulkantestApp.usuario.delete.question" translate-values="{id: '{{vm.usuario.id}}'}">Are you sure you want to delete this Usuario?</p>
    </div>
    <div class="modal-footer">
        <button type="button" class="btn btn-default" data-dismiss="modal" ng-click="vm.clear()">
            <span class="glyphicon glyphicon-ban-circle"></span>&nbsp;<span data-translate="entity.action.cancel">Cancel</span>
        </button>
        <button type="submit" ng-disabled="deleteForm.$invalid" class="btn btn-danger">
            <span class="glyphicon glyphicon-remove-circle"></span>&nbsp;<span data-translate="entity.action.delete">Delete</span>
        </button>
    </div>
</form>

usuario-detail.controller.js

archivo src/main/webapp/app/entities/usuario/usuario-detail.controller.js

(function() {
    'use strict';

    angular
        .module('kukulkantestApp')
        .controller('UsuarioDetailController', UsuarioDetailController);

    UsuarioDetailController.$inject = ['$scope', '$rootScope', '$stateParams', 'previousState', 'DataUtils', 'entity', 'Usuario'];

    function UsuarioDetailController($scope, $rootScope, $stateParams, previousState, DataUtils, entity, Usuario) {
        var vm = this;

        vm.usuario= entity;
        vm.previousState = previousState.name;
        vm.byteSize = DataUtils.byteSize;
        vm.openFile = DataUtils.openFile;

        var unsubscribe = $rootScope.$on('kukulkantestApp:usuarioUpdate', function(event, result) {
            vm.usuario= result;
        });
        $scope.$on('$destroy', unsubscribe);
    }
})();

usuario-detail.html

archivo src/main/webapp/app/entities/usuario/usuario-detail.html

<div>
    <h2><span data-translate="kukulkantestApp.usuario.detail.title">Usuario</span> {{vm.usuario.id}}</h2>
    <hr>
    <jhi-alert-error></jhi-alert-error>
    <dl class="dl-horizontal jh-entity-details">
        <dt><span data-translate="kukulkantestApp.usuario.id">id</span></dt>
        <dd>
			<span>{{vm.usuario.id}}</span>
		<dd>
        <dt><span data-translate="kukulkantestApp.usuario.imagen">imagen</span></dt>
        <dd>            
            <div ng-if="vm.usuario.imagen">
                <a ng-click="vm.openFile(vm.usuario.imagenContentType, vm.usuario.imagen)" data-translate="entity.action.open">open</a>
                {{vm.usuario.imagenContentType}}, {{vm.byteSize(vm.usuario.imagen)}}
            </div>
		<dd>
        <dt><span data-translate="kukulkantestApp.usuario.nombre">nombre</span></dt>
        <dd>
			<span>{{vm.usuario.nombre}}</span>
		<dd>
    </dl>

    <button type="submit"
            ui-sref="{{ vm.previousState }}"
            class="btn btn-info">
        <span class="glyphicon glyphicon-arrow-left"></span>&nbsp;<span data-translate="entity.action.back"> Back</span>
    </button>

    <button type="button" ui-sref="usuario-detail.edit({id:vm.usuario.id})" class="btn btn-primary">
        <span class="glyphicon glyphicon-pencil"></span>
        <span class="hidden-sm-down" data-translate="entity.action.edit"> Edit</span>
    </button>
</div>

usuario-dialog.controller.js

archivo src/main/webapp/app/entities/usuario/usuario-dialog.controller.js

(function() {
    'use strict';

    angular
        .module('kukulkantestApp')
        .controller('UsuarioDialogController', UsuarioDialogController);

    UsuarioDialogController.$inject = ['$timeout', '$scope', '$stateParams', '$uibModalInstance', 'DataUtils', 'entity', 'Usuario'];

    function UsuarioDialogController ($timeout, $scope, $stateParams, $uibModalInstance, DataUtils, entity, Usuario) {
        var vm = this;

        vm.usuario = entity;
        vm.clear = clear;
        vm.byteSize = DataUtils.byteSize;
        vm.openFile = DataUtils.openFile;
        vm.save = save;
          

        $timeout(function (){
            angular.element('.form-group:eq(1)>input').focus();
        });

        function clear () {
            $uibModalInstance.dismiss('cancel');
        }

        function save () {
            vm.isSaving = true;
            if (vm.usuario.id !== null) {
                Usuario.update(vm.usuario, onSaveSuccess, onSaveError);
            } else {
                Usuario.save(vm.usuario, onSaveSuccess, onSaveError);
            }
        }

        function onSaveSuccess (result) {
            $scope.$emit('kukulkantestApp:usuarioUpdate', result);
            $uibModalInstance.close(result);
            vm.isSaving = false;
        }

        function onSaveError () {
            vm.isSaving = false;
        }
        
        vm.setImagen = function ($file, usuario) {
            if ($file) {
                DataUtils.toBase64($file, function(base64Data) {
                    $scope.$apply(function() {
                        usuario.imagen = base64Data;
                        usuario.imagenContentType = $file.type;
                    });
                });
            }
        };

    }
})();

usuario-dialog.html

archivo src/main/webapp/app/entities/usuario/usuario-dialog.html

<form name="editForm" role="form" novalidate ng-submit="vm.save()" show-validation>

    <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-hidden="true"
                ng-click="vm.clear()">&times;</button>
        <h4 class="modal-title" id="myUsuarioLabel" data-translate="kukulkantestApp.usuario.home.createOrEditLabel">Create or edit a Usuario</h4>
    </div>
    <div class="modal-body">
        <jhi-alert-error></jhi-alert-error>
        <div class="form-group" ng-show="vm.usuario.id">
            <label for="id" data-translate="global.field.id">id</label>
            <input type="text" class="form-control" id="id" name="id"
                    ng-model="vm.usuario.id" readonly />
        </div>
			<div class="form-group" ngf-drop ngf-change="vm.setImagen($file, vm.usuario)">
				<label class="control-label" data-translate="kukulkantestApp.usuario.imagen"
					for="field_imagen">imagen</label>
				<div>
					<div ng-if="vm.usuario.imagen" class="help-block clearfix">
						<a class="pull-left"
							ng-click="vm.openFile(vm.usuario.imagenContentType, vm.usuario.imagen)"
							data-translate="entity.action.open">open</a>
						<br>
							<span class="pull-left">{{vm.usuario.imagenContentType}}, {{vm.byteSize(vm.usuario.imagen)}}
							</span>
							<button type="button"
								ng-click="vm.usuario.imagen=null;vm.usuario.imagenContentType=null;"
								class="btn btn-default btn-xs pull-right">
								<span class="glyphicon glyphicon-remove"></span>
							</button>
					</div>
					<button type="button" ngf-select class="btn btn-default btn-block"
						ngf-change="vm.setImagen($file, vm.usuario)" data-translate="entity.action.addblob">
						Add blob
					</button>
				</div>
				<input type="hidden" class="form-control" name="imagen" id="field_imagen"
					ng-model="vm.usuario.imagen" />
				<input type="hidden" class="form-control" name="imagenContentType"
					id="field_imagenContentType" ng-model="vm.usuario.imagenContentType" />
			</div>
			<div class="form-group">
				<label class="control-label" data-translate="kukulkantestApp.usuario.nombre"
					for="field_nombre">nombre</label>
				<input type="text" class="form-control" name="nombre" id="field_nombre"
					ng-model="vm.usuario.nombre" />
			</div>
    </div>
    <div class="modal-footer">
        <button type="button" class="btn btn-default" data-dismiss="modal" ng-click="vm.clear()">
            <span class="glyphicon glyphicon-ban-circle"></span>&nbsp;<span data-translate="entity.action.cancel">Cancel</span>
        </button>
        <button type="submit" ng-disabled="editForm.$invalid || vm.isSaving" class="btn btn-primary">
            <span class="glyphicon glyphicon-save"></span>&nbsp;<span data-translate="entity.action.save">Save</span>
        </button>
    </div>
</form>

usuario.controller.js

archivo src/main/webapp/app/entities/usuario/usuario.controller.js

(function() {
    'use strict';

    angular
        .module('kukulkantestApp')
        .controller('UsuarioController', UsuarioController);

    UsuarioController.$inject = ['$state', 'DataUtils', 'Usuario', 'UsuarioSearch', 'ParseLinks', 'AlertService', 'paginationConstants', 'pagingParams'];

    function UsuarioController($state, DataUtils, Usuario, UsuarioSearch, ParseLinks, AlertService, paginationConstants, pagingParams) {

        var vm = this;

        vm.loadPage = loadPage;
        vm.predicate = pagingParams.predicate;
        vm.reverse = pagingParams.ascending;
        vm.transition = transition;
        vm.itemsPerPage = paginationConstants.itemsPerPage;
        vm.clear = clear;
        vm.search = search;
        vm.loadAll = loadAll;
        vm.searchQuery = pagingParams.search;
        vm.currentSearch = pagingParams.search;
        vm.openFile = DataUtils.openFile;
        vm.byteSize = DataUtils.byteSize;

        loadAll();

        function loadAll () {
            if (pagingParams.search) {
                UsuarioSearch.query({
                    query: pagingParams.search,
                    page: pagingParams.page - 1,
                    size: vm.itemsPerPage,
                    sort: sort()
                }, onSuccess, onError);
            } else {
                Usuario.query({
                    page: pagingParams.page - 1,
                    size: vm.itemsPerPage,
                    sort: sort()
                }, onSuccess, onError);
            }
            function sort() {
                var result = [vm.predicate + ',' + (vm.reverse ? 'asc' : 'desc')];
                if (vm.predicate !== 'id') {
                    result.push('id');
                }
                return result;
            }
            function onSuccess(data, headers) {
                vm.links = ParseLinks.parse(headers('link'));
                vm.totalItems = headers('X-Total-Count');
                vm.queryCount = vm.totalItems;
                vm.usuarios = data;
                vm.page = pagingParams.page;
            }
            function onError(error) {
                AlertService.error(error.data.message);
            }
        }

        function loadPage(page) {
            vm.page = page;
            vm.transition();
        }

        function transition() {
            $state.transitionTo($state.$current, {
                page: vm.page,
                sort: vm.predicate + ',' + (vm.reverse ? 'asc' : 'desc'),
                search: vm.currentSearch
            });
        }

        function search(searchQuery) {
            if (!searchQuery){
                return vm.clear();
            }
            vm.links = null;
            vm.page = 1;
            vm.predicate = '_score';
            vm.reverse = false;
            vm.currentSearch = searchQuery;
            vm.transition();
        }

        function clear() {
            vm.links = null;
            vm.page = 1;
            vm.predicate = 'id';
            vm.reverse = true;
            vm.currentSearch = null;
            vm.transition();
        }
    }
})();

usuario.search.service.js

archivo src/main/webapp/app/entities/usuario/usuario.search.service.js

(function() {
    'use strict';

    angular
        .module('kukulkantestApp')
        .factory('UsuarioSearch', UsuarioSearch);

    UsuarioSearch.$inject = ['$resource'];

    function UsuarioSearch($resource) {
        var resourceUrl =  'api/_search/usuarios/:id';

        return $resource(resourceUrl, {}, {
            'query': { method: 'GET', isArray: true}
        });
    }
})();

usuario.service.js

archivo src/main/webapp/app/entities/usuario/usuario.service.js

(function() {
    'use strict';
    angular
        .module('kukulkantestApp')
        .factory('Usuario', Usuario);

    Usuario.$inject = ['$resource'];

    function Usuario ($resource) {
        var resourceUrl = 'api/usuarios/:id';

        return $resource(resourceUrl, {}, {
            'query': { method: 'GET', isArray: true},
            'get': {
                method: 'GET',
                transformResponse: function (data) {
                    if (data) {
                        data = angular.fromJson(data);
                    }
                    return data;
                }
            },
            'update': { method:'PUT' }<% } %>
        });
    }
})();

usuario.state.js

archivo src/main/webapp/app/entities/usuario/usuario.state.js

(function() {
    'use strict';

    angular
        .module('kukulkantestApp')
        .config(stateConfig);

    stateConfig.$inject = ['$stateProvider'];

    function stateConfig($stateProvider) {
        $stateProvider
        .state('usuario', {
            parent: 'entity',
            url: '/usuarios?page&sort&search',
            data: {
                authorities: ['ROLE_USER'],
                pageTitle: 'kukulkantestApp.usuario.home.title'
            },
            views: {
                'content@': {
                    templateUrl: 'app/entities/usuario/usuarios.html',
                    controller: 'UsuarioController',
                    controllerAs: 'vm'
                }
            },
            params: {
                page: {
                    value: '1',
                    squash: true
                },
                sort: {
                    value: 'id,asc',
                    squash: true
                },
                search: null
            },
            resolve: {
                pagingParams: ['$stateParams', 'PaginationUtil', function ($stateParams, PaginationUtil) {
                    return {
                        page: PaginationUtil.parsePage($stateParams.page),
                        sort: $stateParams.sort,
                        predicate: PaginationUtil.parsePredicate($stateParams.sort),
                        ascending: PaginationUtil.parseAscending($stateParams.sort),
                        search: $stateParams.search
                    };
                }],
                translatePartialLoader: ['$translate', '$translatePartialLoader', function ($translate, $translatePartialLoader) {
                    $translatePartialLoader.addPart('usuario');
                    $translatePartialLoader.addPart('global');
                    return $translate.refresh();
                }]
            }
        })
        .state('usuario-detail', {
            parent: 'usuario',
            url: '/usuarios/{id}',
            data: {
                authorities: ['ROLE_USER'],
                pageTitle: 'kukulkantestApp.usuario.detail.title'
            },
            views: {
                'content@': {
                    templateUrl: 'app/entities/usuario/usuario-detail.html',
                    controller: 'UsuarioDetailController',
                    controllerAs: 'vm'
                }
            },
            resolve: {
                translatePartialLoader: ['$translate', '$translatePartialLoader', function ($translate, $translatePartialLoader) {
                    $translatePartialLoader.addPart('usuario');
                    return $translate.refresh();
                }],
                entity: ['$stateParams', 'Usuario', function($stateParams, Usuario) {
                    return Usuario.get({id : $stateParams.id}).$promise;
                }],
                previousState: ["$state", function ($state) {
                    var currentStateData = {
                        name: $state.current.name || 'usuario',
                        params: $state.params,
                        url: $state.href($state.current.name, $state.params)
                    };
                    return currentStateData;
                }]
            }
        })
        .state('usuario-detail.edit', {
            parent: 'usuario-detail',
            url: '/detail/edit',
            data: {
                authorities: ['ROLE_USER']
            },
            onEnter: ['$stateParams', '$state', '$uibModal', function($stateParams, $state, $uibModal) {
                $uibModal.open({
                    templateUrl: 'app/entities/usuario/usuario-dialog.html',
                    controller: 'UsuarioDialogController',
                    controllerAs: 'vm',
                    backdrop: 'static',
                    size: 'lg',
                    resolve: {
                        entity: ['Usuario', function(Usuario) {
                            return Usuario.get({id : $stateParams.id}).$promise;
                        }]
                    }
                }).result.then(function() {
                    $state.go('^', {}, { reload: false });
                }, function() {
                    $state.go('^');
                });
            }]
        })
        .state('usuario.new', {
            parent: 'usuario',
            url: '/new',
            data: {
                authorities: ['ROLE_USER']
            },
            onEnter: ['$stateParams', '$state', '$uibModal', function($stateParams, $state, $uibModal) {
                $uibModal.open({
                    templateUrl: 'app/entities/usuario/usuario-dialog.html',
                    controller: 'UsuarioDialogController',
                    controllerAs: 'vm',
                    backdrop: 'static',
                    size: 'lg',
                    resolve: {
                        entity: function () {
                            return {
                            	id: null,
                                imagen: null, 
                                imagenContentType: null, 
                                nombre: null
                            };
                        }
                    }
                }).result.then(function() {
                    $state.go('usuario', null, { reload: 'usuario' });
                }, function() {
                    $state.go('usuario');
                });
            }]
        })
        .state('usuario.edit', {
            parent: 'usuario',
            url: '/{id}/edit',
            data: {
                authorities: ['ROLE_USER']
            },
            onEnter: ['$stateParams', '$state', '$uibModal', function($stateParams, $state, $uibModal) {
                $uibModal.open({
                    templateUrl: 'app/entities/usuario/usuario-dialog.html',
                    controller: 'UsuarioDialogController',
                    controllerAs: 'vm',
                    backdrop: 'static',
                    size: 'lg',
                    resolve: {
                        entity: ['Usuario', function(Usuario) {
                            return Usuario.get({id : $stateParams.id}).$promise;
                        }]
                    }
                }).result.then(function() {
                    $state.go('usuario', null, { reload: 'usuario' });
                }, function() {
                    $state.go('^');
                });
            }]
        })
        .state('usuario.delete', {
            parent: 'usuario',
            url: '/{id}/delete',
            data: {
                authorities: ['ROLE_USER']
            },
            onEnter: ['$stateParams', '$state', '$uibModal', function($stateParams, $state, $uibModal) {
                $uibModal.open({
                    templateUrl: 'app/entities/usuario/usuario-delete-dialog.html',
                    controller: 'UsuarioDeleteController',
                    controllerAs: 'vm',
                    size: 'md',
                    resolve: {
                        entity: ['Usuario', function(Usuario) {
                            return Usuario.get({id : $stateParams.id}).$promise;
                        }]
                    }
                }).result.then(function() {
                    $state.go('usuario', null, { reload: 'usuario' });
                }, function() {
                    $state.go('^');
                });
            }]
        });
    }

})();

usuarios.html

archivo src/main/webapp/app/entities/usuario/usuarios.html

<div>
    <h2 data-translate="kukulkantestApp.usuario.home.title">usuarios</h2>
    <jhi-alert></jhi-alert>
    <div class="container-fluid">
        <div class="row">
            <div class="col-xs-4 no-padding-left">
                <button class="btn btn-primary" ui-sref="usuario.new" >
                    <span class="glyphicon glyphicon-plus"></span>
                    <span class="hidden-xs-down" data-translate="kukulkantestApp.usuario.home.createLabel">
                        Create new Usuario
                    </span>
                </button>
            </div>
            <div class="col-xs-8 no-padding-right">
                <form name="searchForm" class="form-inline">
                    <div class="input-group pull-right" >
                        <input type="text" class="form-control" ng-model="vm.searchQuery" id="searchQuery" placeholder="{{ 'kukulkantestApp.usuario.home.search' | translate }}">
                        <span  class="input-group-btn width-min" >
                            <button class="btn btn-info" ng-click="vm.search(vm.searchQuery)">
                                <span class="glyphicon glyphicon-search"></span>
                            </button>
                        </span>
                        <span class="input-group-btn width-min" ng-if="vm.currentSearch">
                            <button class="btn btn-info" ng-click="vm.clear()">
                                <span class="glyphicon glyphicon-trash"></span>
                            </button>
                        </span>
                    </div>
                </form>
            </div>
        </div>
    </div>
    <br/>
    <div class="table-responsive">
        <table class="jh-table table table-striped">
            <thead>
                <tr jh-sort="vm.predicate" ascending="vm.reverse" callback="vm.transition()">
                    <th jh-sort-by="id"><span data-translate="global.field.id">ID</span> <span class="glyphicon glyphicon-sort"></span></th>
                    <th jh-sort-by="imagen"><span data-translate="kukulkantestApp.usuario.imagen">imagen</span> <span class="glyphicon glyphicon-sort"></span></th>
                    <th jh-sort-by="nombre"><span data-translate="kukulkantestApp.usuario.nombre">nombre</span> <span class="glyphicon glyphicon-sort"></span></th>
                    <th></th>
                </tr>
            </thead>
            <tbody ng-repeat="usuario in vm.usuarios track by usuario.id">
                    <td><a ui-sref="usuario-detail({id:usuario.id})">{{usuario.id}}</a></td>
					<td>
						<a ng-if="usuario.imagen" ng-click="vm.openFile(usuario.imagenContentType, usuario.imagen)" data-translate="entity.action.open">open</a>
                        <span ng-if="usuario.imagen">{{usuario.imagenContentType}}, {{vm.byteSize(usuario.imagen)}}</span> 
					</td>     
					<td>{{usuario.nombre}}</td>
                    <td class="text-right">
                        <div class="btn-group flex-btn-group-container">
                            <button type="submit"
                                    ui-sref="usuario-detail({id:usuario.id})"
                                    class="btn btn-info btn-sm">
                                <span class="glyphicon glyphicon-eye-open"></span>
                                <span class="hidden-sm-down" data-translate="entity.action.view"></span>
                            </button>
                            <button type="submit"
                                    ui-sref="usuario.edit({id:usuario.id})"
                                    class="btn btn-primary btn-sm">
                                <span class="glyphicon glyphicon-pencil"></span>
                                <span class="hidden-sm-down" data-translate="entity.action.edit"></span>
                            </button>
                            <button type="submit"
                                    ui-sref="usuario.delete({id:usuario.id})"
                                    class="btn btn-danger btn-sm">
                                <span class="glyphicon glyphicon-remove-circle"></span>
                                <span class="hidden-sm-down" data-translate="entity.action.delete"></span>
                            </button>
                        </div>
                    </td>
                </tr>
            </tbody>
        </table>
    </div>
    <div class="text-center">
        <jhi-item-count page="vm.page" total="vm.queryCount" items-per-page="vm.itemsPerPage"></jhi-item-count>
        <uib-pagination class="pagination-sm" total-items="vm.totalItems" items-per-page="vm.itemsPerPage" ng-model="vm.page" ng-change="vm.transition()"></uib-pagination>
    </div>
</div>

usuario.json

archivo src/main/webapp/i18n/en/usuario.json

{
    "kukulkantestApp": {
        "usuario" : {
            "home": {
                "title": "usuarios",
                "createLabel": "Create a new Usuario",
                "createOrEditLabel": "Create or edit a Usuario"
            },
            "created": "A new Usuario is created with identifier {{ param }}",
            "updated": "A Usuario is updated with identifier {{ param }}",
            "deleted": "A Usuario is deleted with identifier {{ param }}",
            "delete": {
                "question": "Are you sure you want to delete Usuario {{ id }}?"
            },
            "detail": {
                "title": "Usuario"
            },
            "imagen": "Imagen", 
            "imagenContentType": "ImagenContentType", 
            "nombre": "Nombre"
        }
    }
}

usuario.json

archivo src/main/webapp/i18n/es/usuario.json

{
    "kukulkantestApp": {
        "usuario" : {
            "home": {
                "title": "usuarios",
                "createLabel": "Crear nuevo Usuario",
                "createOrEditLabel": "Crear o editar Usuario",
                "search": "Buscar Usuario"
            },
            "created": "Un nuevo Usuario ha sido creado con el identificador {{ param }}",
            "updated": "Un Usuario ha sido actualizado con el identificador {{ param }}",
            "deleted": "Un Usuario ha sido eliminado con el identificador {{ param }}",
            "delete": {
                "question": "¿Seguro que quiere eliminar Usuario {{ id }}?"
            },
            "detail": {
                "title": "Usuario"
            },
            "imagen": "Imagen", 
            "imagenContentType": "ImagenContentType", 
            "nombre": "Nombre"
        }
    }
}