Post запрос Rest api

Добрый день.

Пытаюсь написать сервис про созданию записи в сущности Employee.
Вот bean сервиса:

@Service(EmployeeService.NAME)
public class EmployeeServiceBean implements EmployeeService {


    @Inject
    private DataManager dataManager;


    @Inject
    private Metadata metadata;

    @Override
    @ResponseStatus(HttpStatus.OK)
    public @ResponseBody  ResponseInfo createNewEmployee(EmployeeInfo employeeInfo) {
        ResponseInfo responseInfo = new ResponseInfo();
        try {

            System.out.println("Empl: " + employeeInfo.toString());
            // Создаем новую запись в сущности
            Employee employee = metadata.create(Employee.class);

            employee.setEmplfirstname(employeeInfo.getEmployeefirstName());
            employee.setEmplfulldeppath(employeeInfo.getEmployeeFullDepartmantPath());
            employee.setEmplmiddlename(employeeInfo.getEmployeeMiddleName());
            employee.setEmpllastname(employeeInfo.getEmployeeLastName());
            employee.setEmplphone(employeeInfo.getEmployeePhone());
            employee.setEmplshortdeppath(employeeInfo.getEmployeeShortDepartmantPath());
            employee.setEmplpost(employeeInfo.getEmployeePost());
            employee.setEmplsex(employeeInfo.getEmployeeSex());

            dataManager.commit(employee);

            responseInfo.setResponsestatus("OK");
    }catch (Exception e) {
            e.printStackTrace();
            responseInfo.setResponsestatus("Error");
            responseInfo.setResponseerrorText(e.getLocalizedMessage());
            try {
                throw new MyException(e.getLocalizedMessage());
            } catch (MyException e1) {
                e1.printStackTrace();
            }
        }

        finally {
            return responseInfo;
        }
}
}

На вход подаю класс EmployeeInfo :

public class EmployeeInfo implements Serializable {

    private String employeeLastName;
    private String employeefirstName;
    private String employeeMiddleName;
    private String employeePost;
    private String employeeShortDepartmantPath;
    private String employeeFullDepartmantPath;
    private String employeeSex;
    private String employeePhone;


    public EmployeeInfo(String employeeLastName, String employeefirstName,
                        String employeeMiddleName, String employeePost,
                        String employeeShortDepartmantPath, String employeeFullDepartmantPath,
                        String employeeSex, String employeePhone) {
        this.employeeLastName = employeeLastName;
        this.employeefirstName = employeefirstName;
        this.employeeMiddleName = employeeMiddleName;
        this.employeePost = employeePost;
        this.employeeShortDepartmantPath = employeeShortDepartmantPath;
        this.employeeFullDepartmantPath = employeeFullDepartmantPath;
        this.employeeSex = employeeSex;
        this.employeePhone = employeePhone;
    }

    public String getEmployeePhone() {
        return employeePhone;
    }

    public void setEmployeePhone(String employeePhone) {
        this.employeePhone = employeePhone;
    }

    public String getEmployeeLastName() {
        return employeeLastName;
    }

    public void setEmployeeLastName(String employeeLastName) {
        this.employeeLastName = employeeLastName;
    }

    public String getEmployeefirstName() {
        return employeefirstName;
    }

    public void setEmployeefirstName(String employeefirstName) {
        this.employeefirstName = employeefirstName;
    }

    public String getEmployeeMiddleName() {
        return employeeMiddleName;
    }

    public void setEmployeeMiddleName(String employeeMiddleName) {
        this.employeeMiddleName = employeeMiddleName;
    }

    public String getEmployeePost() {
        return employeePost;
    }

    public void setEmployeePost(String employeePost) {
        this.employeePost = employeePost;
    }

    public String getEmployeeShortDepartmantPath() {
        return employeeShortDepartmantPath;
    }

    public void setEmployeeShortDepartmantPath(String employeeShortDepartmantPath) {
        this.employeeShortDepartmantPath = employeeShortDepartmantPath;
    }

    public String getEmployeeFullDepartmantPath() {
        return employeeFullDepartmantPath;
    }

    public void setEmployeeFullDepartmantPath(String employeeFullDepartmantPath) {
        this.employeeFullDepartmantPath = employeeFullDepartmantPath;
    }

    public String getEmployeeSex() {
        return employeeSex;
    }

    public void setEmployeeSex(String employeeSex) {
        this.employeeSex = employeeSex;
    }


    @Override
    public String toString() {
        return "EmployeeInfo{" +
                "employeeLastName='" + employeeLastName + '\'' +
                ", employeefirstName='" + employeefirstName + '\'' +
                ", employeeMiddleName='" + employeeMiddleName + '\'' +
                ", employeePost='" + employeePost + '\'' +
                ", employeeShortDepartmantPath='" + employeeShortDepartmantPath + '\'' +
                ", employeeFullDepartmantPath='" + employeeFullDepartmantPath + '\'' +
                ", employeeSex='" + employeeSex + '\'' +
                ", employeePhone='" + employeePhone + '\'' +
                '}';
    }
}

Вызываю метод сервиса следующим образом:

private void runEmployeeService (String authToken) throws IOException {
    	URL url = new URL (Constants.serviceURLString);
    	servConnection = (HttpURLConnection) url.openConnection();

    	servConnection.setRequestProperty("Authorization", "Bearer "+authToken);
    	servConnection.setRequestMethod("POST");
    	servConnection.setRequestProperty("Accept-Charset", "UTF-8");
    	servConnection.setConnectTimeout(9000);
    	servConnection.setDoOutput(true);
    	
    
    	// Записываем данные в массив
    	EmployeeInfo employeeInfo = new EmployeeInfo("Петров",
    			"Петр", "Петрович",
    			"Программист", "ОРПО",
    			"ДИТ/ОРПО", "МУЖ", 
    			"12345");
    	      	Gson gson = new Gson();
    	String jsonInString = gson.toJson(employeeInfo);
    	
    	jsonInString = "{\n \"employeeInfo\":"+jsonInString+"}";

    	System.out.println("EmployeeInfo :"+ jsonInString);
    	OutputStream os = servConnection.getOutputStream();
    	os.write(jsonInString.getBytes());
    	os.flush();
    	os.close();

    	servConnection.connect();
    	
    	int respCode = servConnection.getResponseCode();
    	
    	if (respCode == 200 ||  respCode== 204) {
    		System.out.println("Сервис по созданию сотрудников отработал");
    		String responseJson = "";
    		String inputLine;
    		BufferedReader in = new BufferedReader(new InputStreamReader((servConnection.
    				getInputStream()),"UTF-8"));
    		while ((inputLine = in.readLine()) != null) 
    			responseJson += inputLine;
    		in.close();
    		
    		System.out.println("Ответ сервиса: \n"+ responseJson);
    	} else {
    		 System.out.println("Сервис по созданию сотрудников вернул код: "+
    				 servConnection.getResponseCode());
    		 
    			String responseJson = "";
        		String inputLine;
        		BufferedReader in = new BufferedReader(new InputStreamReader((servConnection.
        				getInputStream()),"UTF-8"));
        		while ((inputLine = in.readLine()) != null) 
        			responseJson += inputLine;
        		in.close();
        		System.out.println("Ответ сервиса: \n"+ responseJson);
    	}
    	
    	
    }

При этом сервис возвращает:
Сервис по созданию сотрудников вернул код: 500
java.io.IOException: Server returned HTTP response code: 500 for URL: http://localhost:8080/bankref/rest/v2/services/bankref_EmployeeService/createNewEmployee

В логах Tomkat сообщение :
Caused by: com.google.gson.stream.MalformedJsonException: Use JsonReader.setLenient(true) to accept malformed JSON at line 1 column 166 path $
at com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1568) ~[gson-2.8.2.jar:na]
at com.google.gson.stream.JsonReader.checkLenient(JsonReader.java:1409) ~[gson-2.8.2.jar:na]
at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:542) ~[gson-2.8.2.jar:na]
at com.google.gson.stream.JsonReader.peek(JsonReader.java:425) ~[gson-2.8.2.jar:na]
at com.google.gson.JsonParser.parse(JsonParser.java:60) ~[gson-2.8.2.jar:na]
… 85 common frames omitted

Подскажите пожалуйста в чем может быть проблема.

Здравствуйте,

В сервисах среднего слоя нельзя использовать аннотации Spring MVC, они никак не связаны с HTTP протоколом и могут вызываться в приложении без отправки данных по сети. Сервис среднего слоя - это абстракция бизнес логики, а не транспортный уровень.

Если вы хотите реализовать свой контроллер MVC для REST-API, воспользуйтесь руководством https://doc.cuba-platform.com/manual-6.10-ru/rest_api_v2_custom_controllers.html.

1 симпатия

Спасибо большое за ответ.

Переписал на вызов Контроллера:

@RestController
@RequestMapping(value = "/myapi", method = RequestMethod.POST)
public class MyController {

    private Logger log = LoggerFactory.getLogger(MyController.class);

    @Inject
    private DataManager dataManager;


    @Inject
    private Metadata metadata;

    @GetMapping("/createNewEmployee")
    public ResponseInfo createNewEmployee(EmployeeInfo employeeInfo) {
        ResponseInfo responseInfo = new ResponseInfo();
        log.info("createNewEmployee run ");
        try {

            log.info(employeeInfo.toString());

            // Создаем новую запись в сущности
            Employee employee = metadata.create(Employee.class);

            employee.setEmplfirstname(employeeInfo.getEmployeefirstName());
            employee.setEmplfulldeppath(employeeInfo.getEmployeeFullDepartmantPath());
            employee.setEmplmiddlename(employeeInfo.getEmployeeMiddleName());
            employee.setEmpllastname(employeeInfo.getEmployeeLastName());
            employee.setEmplphone(employeeInfo.getEmployeePhone());
            employee.setEmplshortdeppath(employeeInfo.getEmployeeShortDepartmantPath());
            employee.setEmplpost(employeeInfo.getEmployeePost());
            employee.setEmplsex(employeeInfo.getEmployeeSex());

            dataManager.commit(employee);

            responseInfo.setResponsestatus("OK");
        }catch (Exception e) {
            e.printStackTrace();
            responseInfo.setResponsestatus("Error");
            responseInfo.setResponseerrorText(e.getLocalizedMessage());
            log.error(e.getLocalizedMessage());

        }

        finally {
            return responseInfo;
        }
    }
}

вызов сервиса оставил таким же:

private void runEmployeeService (String authToken) throws IOException {
    	URL url = new URL (Constants.serviceURLString);
    	servConnection = (HttpURLConnection) url.openConnection();

    	servConnection.setRequestProperty("Authorization", "Bearer "+authToken);
    	servConnection.setRequestMethod("POST");
    	servConnection.setRequestProperty("Accept-Charset", "UTF-8");
    	servConnection.setConnectTimeout(9000);
    	servConnection.setDoOutput(true);
    	
    
    	// Записываем данные в массив
    	EmployeeInfo employeeInfo = new EmployeeInfo("Петров",
    			"Петр", "Петрович",
    			"Программист", "ОРПО",
    			"ДИТ/ОРПО", "МУЖ", 
    			"12345");
    	      	Gson gson = new Gson();
    	String jsonInString = gson.toJson(employeeInfo);
    	
    	jsonInString = "{\n \"employeeInfo\":"+jsonInString+"}";

    	System.out.println("EmployeeInfo :"+ jsonInString);
    	OutputStream os = servConnection.getOutputStream();
    	os.write(jsonInString.getBytes());
    	os.flush();
    	os.close();

    	servConnection.connect();
    	
    	int respCode = servConnection.getResponseCode();
    	
    	if (respCode == 200 ||  respCode== 204) {
    		System.out.println("Сервис по созданию сотрудников отработал");
    		String responseJson = "";
    		String inputLine;
    		BufferedReader in = new BufferedReader(new InputStreamReader((servConnection.
    				getInputStream()),"UTF-8"));
    		while ((inputLine = in.readLine()) != null) 
    			responseJson += inputLine;
    		in.close();
    		
    		System.out.println("Ответ сервиса: \n"+ responseJson);
    	} else {
    		 System.out.println("Сервис по созданию сотрудников вернул код: "+
    				 servConnection.getResponseCode());
    		 
    			String responseJson = "";
        		String inputLine;
        		BufferedReader in = new BufferedReader(new InputStreamReader((servConnection.
        				getInputStream()),"UTF-8"));
        		while ((inputLine = in.readLine()) != null) 
        			responseJson += inputLine;
        		in.close();
        		System.out.println("Ответ сервиса: \n"+ responseJson);
    	}
    	
    	
    }

Теперь сервис возвращает ResponseCode 200, но почему-то входной параметр employeeInfo в логах пишет пустой json:

17:42:36.540 INFO c.c.bankref.web.myapi.MyController - EmployeeInfo{employeeLastName=‘null’, employeefirstName=‘null’, employeeMiddleName=‘null’, employeePost=‘null’, employeeShortDepartmantPath=‘null’, employeeFullDepartmantPath=‘null’, employeeSex=‘null’, employeePhone=‘null’}

Подскажите пожалуйста, что не так с вызовом

Решил проблему следующим образом:
В методе контроллера на вход подаю:

  public ResponseInfo createNewEmployee(@RequestBody String  employeeInfoJsonString) 

А Далее в самом методе преобразую employeeInfoJsonString в Класс EmployeeInfo с помощью GSON.