Spring java ResponseEntity con multiples tipos de parámetros

publicado por: Anonymous

Estoy trabajando con java y Spring MVC, En la primera versión de mi aplicación estaba respondiendo con un ResponseEntity<String> y cuando encontraba un error, retornaba algo como return new ResponseEntity<String>(httpErrors.toString(), responseHeaders, HttpStatus.BAD_REQUEST); cuando todo estaba correcto respondia con return new ResponseEntity<String>(loginResponse.toString(), responseHeaders, HttpStatus.OK);. Pero ahora pienso que hay una mejor forma de hacerlo, retornando un objeto especifico de acuerdo a cada caso, sin usar el método toString(), algo como lo siguiente:

@RestController
@RequestMapping("/user")
public class LoginController {

    /** The login service to validate the user. */
    @Autowired
    LoginService loginService;

    @RequestMapping(value = "/login", method = RequestMethod.POST)
    public @ResponseBody ResponseEntity<?> validate(@RequestBody final UserLog login) {

        WebUser webUser = loginService.getUserDetails(login.getLogin(), login.getPassword());
        HttpHeaders responseHeaders = new HttpHeaders();
        responseHeaders.setContentType(MediaType.APPLICATION_JSON);

        if (webUser == null) {
            HttpErrors httpErrors = new HttpErrors(ApiCommonResources.ERROR_402, "error" + "." + ApiCommonResources.ERROR_402, ApiCommonResources.ERROR_402_TEXT);
            return new ResponseEntity<HttpErrors>(httpErrors, responseHeaders, HttpStatus.BAD_REQUEST);
        }

        List<Account> userAccounts = loginService.getMerchantAccounts(webUser.getMerchantId());

        // Json Web Token builder
        token = "b7d22951486d713f92221bb987347777";

        LoginResponse loginResponse = new LoginResponse(ApiCommonResources.SUCCESS_REQUEST_CODE, token);

        return new ResponseEntity<LoginResponse>(loginResponse, responseHeaders, HttpStatus.OK);

    }

}

La pregunta es, cómo puedo crear una clase que empaquete el LoginResponse tanto como HttpErrorscomo tipos de objeto y asignarlo en el ? como retorno de mí clase ResponseEntity:

Clase LoginResponse:

public class LoginResponse{

    public LoginResponse(Integer statusCode, String token){
        this.setStatusCode(statusCode);
        this.setToken(token);
    }

    private String token;
    private Integer statusCode;

    public String getToken() {
        return token;
    }

    public void setToken(String token) {
        this.token = token;
    }

    public Integer getStatusCode() {
        return statusCode;
    }

    public void setStatusCode(Integer statusCode) {
        this.statusCode = statusCode;
    }

    @Override
    public String toString() {

        StringBuilder jsonResponse = new StringBuilder();

        jsonResponse.append("{");
        jsonResponse.append(""statusCode":");
        jsonResponse.append(""" + statusCode + "",");
        jsonResponse.append(""token":");
        jsonResponse.append(""" + token + """);
        jsonResponse.append("}");

        return jsonResponse.toString();
    }

}

Y clase HttpErrors:

public class HttpErrors {

    public HttpErrors(){
    }

    public HttpErrors(String errorCode, String errorKey, String errorMessage) {
        super();
        this.errorCode = errorCode;
        this.errorKey = errorKey;
        this.errorMessage = errorMessage;
    }

    private String errorCode;
    private String errorKey;
    private String errorMessage;

    public String getErrorCode() {
        return errorCode;
    }

    public void setErrorCode(String errorCode) {
        this.errorCode = errorCode;
    }

    public String getErrorKey() {
        return errorKey;
    }

    public void setErrorKey(String errorKey) {
        this.errorKey = errorKey;
    }

    public String getErrorMessage() {
        return errorMessage;
    }

    public void setErrorMessage(String errorMessage) {
        this.errorMessage = errorMessage;
    }

    @Override
    public String toString() {

        StringBuilder jsonError = new StringBuilder();

        jsonError.append("{");
        jsonError.append(""errorCode":");
        jsonError.append(""" + errorCode + "",");
        jsonError.append(""errorKey":");
        jsonError.append(""" + errorKey + "",");
        jsonError.append(""errorMessage":");
        jsonError.append(""" + errorMessage + """);
        jsonError.append("}");

        return jsonError.toString();
    }

}

solución

Yo haría que tus clases LoginResponse y HttpError extiendan de una interfaz o clase abstracta común. Por dar un nombre, esta seria Response:

public interface Response {
}

public class LoginResponse implements Response {
    /* contenido */
}

public class HttpError implements Response {
    /* contenido */
}

De manera que en el constructor de ResponseEntity pueda utilizar la siguiente figura:

public class ResponseEntity<T extends Response> {
    private String data;
    //quizas aca necesites mas argumentos, no lo se
    public ResponseEntity (T entity, HttpHeaders headers, Integer status) {
        data = entity.toString();
        //uso de los demas argumentos
    }
    /* resto del contenido */
}

Así tu código se vuelve más limpio, mantenible y sencillo de utilizar.

Respondido por: user227

Leave a Reply

Your email address will not be published. Required fields are marked *