Возврат ошибки JSON-ответ в случае CustomException вместо обычного json-ответа, сопоставленного с bean-компонентом при загрузке Sping Restful ws - PullRequest
0 голосов
/ 30 апреля 2018

У меня есть веб-сервис Restful, использующий загрузку Spring. Ответ - боб EmployeeResponseData, который преобразуется в json к весне. В соответствии с бизнесом веб-сервис должен возвращать данные сотрудника, когда введенный идентификатор сотрудника совпадает, иначе должен быть возвращен ответ json с ошибкой, как показано ниже

{"Error ": "Employee not not found for empId "+ **empId** }

На данный момент я получаю правильный ответ json согласно бину EmployeeResponseData, если входной empId совпадает. Но я получаю пустым, если empId не совпадает.

Как я могу вернуть JSON с желаемой ошибкой в ​​случае пользовательского исключения, без необходимости формировать json и возвращать вместо использования bean-объектов в качестве возвращаемого объекта, поскольку он автоматически преобразуется в jSON с помощью Spring.

Ниже приведен код.

Фасоль

EmployeeRequestData

package com.beans;

import org.springframework.stereotype.Component;

@Component
public class EmployeeRequestData {
    private int EmpoyeeId;

    public int getEmpoyeeId() {
        return EmpoyeeId;
    }

    public void setEmpoyeeId(int empoyeeId) {
        EmpoyeeId = empoyeeId;
    }


}

EmployeeResponseData

package com.beans;

import java.util.ArrayList;

import org.springframework.stereotype.Component;

@Component
public class EmployeeResponseData {

    private int employeeId;
    private String name;
    private String department;
    private ArrayList<String> skills; 

    public int getEmployeeId() {
        return employeeId;
    }
    public void setEmployeeId(int employeeId) {
        this.employeeId = employeeId;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public String getDepartment() {
        return department;
    }
    public void setDepartment(String department) {
        this.department = department;
    }
    public ArrayList<String> getSkills() {
        return skills;
    }
    public void setSkills(ArrayList<String> skills) {
        this.skills = skills;
    }   
}

Контроллер

package com.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import com.beans.EmployeeResponseData;
import com.service.ServiceRequest;

@RestController
public class WebServiceController {

    @Autowired
    private ServiceRequest serviceRequest;

    @RequestMapping(value="restws/getEmpDetails/{empId}",method=RequestMethod.GET)
    //@ResponseBody   // not required since using @RestController
    public EmployeeResponseData getEmployeeDetails(@PathVariable("empId") int empId) {
        return serviceRequest.getEmployeeDetails(empId);
    }
}

Услуги

package com.service;

import java.util.ArrayList;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.beans.EmployeeResponseData;
import com.exception.EmployeeNotFoundException;

@Service
public class ServiceRequest {

    private static Logger LOGGER = LoggerFactory.getLogger(ServiceRequest.class);

    @Autowired
    private EmployeeResponseData employeeResponseData;

    public EmployeeResponseData getEmployeeDetails(int empId) {

             ArrayList<String> employeeSkills = (ArrayList<String>) Stream.of("Core Java"
                    ,"Restful web services"
                    ,"Spring Boot"
                    ,"PLSQL").collect(Collectors.toList());

            employeeResponseData.setEmployeeId(empId);
            employeeResponseData.setName("Priyanjan Kumar");
            employeeResponseData.setDepartment("ENGNE");
            employeeResponseData.setSkills(employeeSkills);
        }else {
            try {
                throw new EmployeeNotFoundException(empId);
            } catch (EmployeeNotFoundException e) {
                LOGGER.info("Employee data not found for empId :"+empId);
            }
        }
        return employeeResponseData;
    }
}

Пользовательское исключение

package com.exception;

public class EmployeeNotFoundException extends Exception{

    private String message = "Employee not found";

    public EmployeeNotFoundException() {
        // super(message); it takes only static variable
    }

    public EmployeeNotFoundException(int empId) {
        message = message+" for Employee : "+ Integer.toString(empId);
    }

    @Override
    public String toString() {
        return message;
    }
}

SpringBootApplication

package com;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


@SpringBootApplication
public class App {
    public static void main(String[] args) {
        SpringApplication.run(App.class);
    }
}

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Вы можете использовать аннотацию @ControllerAdvice для обработки различных типов исключений, возникающих в приложении.

https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/bind/annotation/ControllerAdvice.html

Ниже приведен пример кода, как это выглядит:

@ControllerAdvice
public class RestExceptionHandler extends ResponseEntityExceptionHandler {

    @ExceptionHandler(EmployeeNotFoundException.class)
    public ResponseEntity<String> handleEntityNotFoundException(HttpServletRequest request, Exception ex) {
        return ResponseUtil.buildErrorResponseEntity(ex.getMessage(), HttpStatus.NOT_FOUND);
    }

    @ExceptionHandler(Exception.class)
    public ResponseEntity<String> handleGenericException(HttpServletRequest request, Exception ex) {
        return ResponseUtil.buildErrorResponseEntity(ex.getMessage(), HttpStatus.BAD_REQUEST);
    }
}

Вы можете написать метод для создания сообщений об ошибках согласно вашему требованию.

Кроме того, вам нужно добавить объявление исключения в вашем контроллере следующим образом:

public EmployeeResponseData getEmployeeDetails(@PathVariable("empId") int empId) throws Exception {
    return serviceRequest.getEmployeeDetails(empId);
}

Возможно, вам придется переписать логику класса обслуживания, чтобы получить данные из какого-либо ресурса или БД, и на основе результата вы можете построить ответ компонента в случае успеха или, соответственно, вызвать исключение.

public EmployeeResponseData getEmployeeDetails(int empId) {

     // Get data from resource/DB based on empId
     EmployeeResponseData employeeResponseData = new EmployeeResponseData();
     if (data != null) {
         ArrayList<String> employeeSkills = (ArrayList<String>) Stream.of("Core Java"
                ,"Restful web services"
                ,"Spring Boot"
                ,"PLSQL").collect(Collectors.toList());

        employeeResponseData.setEmployeeId(empId);
        employeeResponseData.setName("Priyanjan Kumar");
        employeeResponseData.setDepartment("ENGNE");
        employeeResponseData.setSkills(employeeSkills);
    } else {
           throw new EmployeeNotFoundException(empId);
        }
    }
    return employeeResponseData;
}
0 голосов
/ 01 мая 2018

Сначала напишите класс POJO с именем ApiErrorReponse.java

public class ApiErrorResponse{
    private final String error;
    //Any addtional info you might later want to add to it
    public ApiErrorResponse(String error){
        this.error = error;
    }

    public String getError(){
        return this.error;
    }
}

Теперь в вашем контроллере измените конечную точку на.

@RequestMapping(value="restws/getEmpDetails/{empId}",method=RequestMethod.GET)
public ResponseEntity<?> getEmployeeDetails(@PathVariable("empId") int empId) {
    EmployeeResponseData data = serviceRequest.getEmployeeDetails(empId);

    if(data != null){
        return new ResponseEntity<EmployeeResponseData>(data, HttpStatus.OK);
    }

    ApiErrorResponse errorReponseDto = new ApiErrorResponse("Employee not not found for empId "+ empId);
    return  new ResponseEntity<ApiErrorResponse>(errorReponseDto, HttpStatus.NOT_FOUND);
}

Возможно, вы захотите улучшить основы, ваш класс обслуживания плохо написан и может работать не всегда.

EDIT

Итак, согласно вашему комментарию, вы можете выбросить исключение (я) в вашем классе обслуживания и в вашем контроллере, перехватить эти исключения и вернуть сообщение об исключении как ответ об ошибке.

@RequestMapping(value="restws/getEmpDetails/{empId}",method=RequestMethod.GET)
public ResponseEntity<?> getEmployeeDetails(@PathVariable("empId") int empId) {

    try{
        EmployeeResponseData data = serviceRequest.getEmployeeDetails(empId);
        return new ResponseEntity<EmployeeResponseData>(data, HttpStatus.OK);
    }
    catch(Exception ex){
        ApiErrorResponse errorReponseDto = new ApiErrorResponse(ex.getMessage());
        return  new ResponseEntity<ApiErrorResponse>(errorReponseDto, HttpStatus.NOT_FOUND);    
    }
}
...