REST/JSON no MAF

REST/JSON tem várias vantagens sobre SOAP/XML, por isso é o preferido para mobile web services. Como REST/JSON é menor do que o SOAP/XML, você estará passando muito menos dados através da rede. Para dispositivos móveis, é um ponto muito importante.

Neste post vou criar um CRUD de funcionários no Oracle MAF 2.0 usando REST/JSON.
Vou usar este aplicativo REST (Expor ADF BC como RESTful Web Service).
Faça o download do aplicativo de amostra: MAFRESTJSONApp.zip.

Inicialize o REST Web Service.

restjson-in-maf1

Crie um aplicativo Framework Mobile Application, e nomeie como MAFRESTJSONApp.
No arquivo maf-feature.xml, crie uma nova feature e nomeie como employees.
Clique na guia Content e, em seguida, clique no botão de mais verde perto do campo File, para criar o EmployeesTF Task Flow.

Crie a REST Connection.
Vá ao painel Projects, clique com o botão direito no projeto ViewController e selecione New > From Gallery.
Na caixa de diálogo New Gallery, escolha General > Connections > REST Connection.
Se você clicar no botão Test Connection, você receberá um erro.
É intencional, porque eu quero usar a mesma conexão REST para todas as operações.

restjson-in-maf2

Crie a entidade Employee.
Vá ao painel Projects, clique com o botão direito no projeto ViewController e selecione New > Java Class.
Nesta aplicação, a classe Employee deve implementar a classe Cloneable.

restjson-in-maf3

Copie o seguinte código dentro da classe Employee.

private Integer employeeId;
private String firstName;
private String lastName;
private String email;
private String phoneNumber;
private java.sql.Date hireDate;
private String jobId;
private BigDecimal salary;
private BigDecimal commissionPct;
private Integer managerId;
private Integer departmentId;

protected Object clone() throws CloneNotSupportedException {
  return super.clone();
}

Gere os assessores.
Marque esta opção: “Notify listeners when property changes”.

restjson-in-maf4

Crie a entidade Employees.
Vá ao painel Projects, clique com o botão direito no projeto ViewController e selecione New > Java Class.

restjson-in-maf5

Copie o seguinte código dentro da classe Employees.

private Employee [] employee;

public void setEmployee(Employee[] employee) {
  this.employee = employee;
}

public Employee[] getEmployee() {
  return employee;
}

public List getEmployeesAsList() {
  return Arrays.asList(this.employee);
}

Crie a classe Utilitária RestServiceUtil.
Vá ao painel Projects, clique com o botão direito no projeto ViewController e selecione New > Java Class.
Desmarcar esta opção: “Constructors from Superclass”.

restjson-in-maf6

Copie o seguinte código dentro da classe RestServiceUtil.

private String connectionName;

public RestServiceUtil(String connectionName) {
  super();
  this.connectionName = connectionName;
}

public String invokeCreate(String requestURI, Object postData) {
  return invokeRestService(RestServiceAdapter.REQUEST_TYPE_PUT, requestURI, postData);
}

public String invokeUpdate(String requestURI, Object postData) {
  return invokeRestService(RestServiceAdapter.REQUEST_TYPE_POST, requestURI, postData);
}

public String invokeDelete(String requestURI) {
  return invokeRestService(RestServiceAdapter.REQUEST_TYPE_DELETE, requestURI, null);
}

public String invokeFind(String requestURI, Object postData) {
  return invokeRestService(RestServiceAdapter.REQUEST_TYPE_GET, requestURI, postData);
}

private String invokeRestService(String requestType, String requestURI, Object postData) {
  RestServiceAdapter restServiceAdapter = Model.createRestServiceAdapter();
  restServiceAdapter.clearRequestProperties();
  restServiceAdapter.setConnectionName(connectionName);
  restServiceAdapter.setRequestType(requestType);
  restServiceAdapter.setRetryLimit(0);
  restServiceAdapter.setRequestURI(requestURI);
  restServiceAdapter.addRequestProperty("Content-Type", "application/json");
  restServiceAdapter.addRequestProperty("Accept", "application/json; charset=UTF-8");

  String response = "";
  String postDataStr = "";

  try {
    if (postData != null) {
      JSONObject jsonObj = (JSONObject) JSONBeanSerializationHelper.toJSON(postData);
      removeNullsAndTypeFromJSON(jsonObj);
      postDataStr = jsonObj.toString();
    }

    response = restServiceAdapter.send(postDataStr);

  } catch (AdfInvocationException ex) {
    if (AdfInvocationException.CATEGORY_WEBSERVICE.compareTo(ex.getErrorCategory()) == 0) {
      throw new RuntimeException("Error with the server. Please try later.");
    }
  } catch (Exception e) {
    throw new AdfException(e.getLocalizedMessage(), AdfException.ERROR);
  }

  return response;
}

private void removeNullsAndTypeFromJSON(JSONObject jsonObj) throws JSONException {
  jsonObj.remove(".type");

  for (int i = 0; i < jsonObj.length(); i++) {
    String key = jsonObj.names().getString(i);
    if (JSONBeanSerializationHelper.isObjectNull(jsonObj.get(key))) {
      jsonObj.remove(key);
      i--;
    }
  }
}

Crie a classe EmployeesPojoDC.
Vá ao painel Projects, clique com o botão direito no projeto ViewController e selecione New > Java Class.

restjson-in-maf7

Copie o seguinte código dentro da classe EmployeesPojoDC.

private final String connectionName = "RESTWebServiceConn";
private final String requestURI = "/employees";
private RestServiceUtil restServiceUtil = new RestServiceUtil(connectionName);
private Employee employee;
private List employees = new ArrayList();

public EmployeesPojoDC() {
  super();


public void setEmployee(Employee employee) {
  this.employee = employee;
}

public Employee getEmployee() {
  return employee;
}

public Employee[] getEmployees() {
  return (Employee[]) employees.toArray(new Employee[employees.size()]);
}

public void initEmployeeToAdd() {
  employee = new Employee();
}

public void initEmployeeToEdit(Employee employee) throws CloneNotSupportedException {
  this.employee = (Employee) employee.clone();
}

public void findAll() {
  this.employees.clear();

  try {
    String response = restServiceUtil.invokeFind(requestURI, null);
    Employees employees = (Employees) JSONBeanSerializationHelper.fromJSON(Employees.class, response);
    this.employees.addAll(employees.getEmployeesAsList());

  } catch (Exception e) {
    throw new AdfException(e.getLocalizedMessage(), AdfException.ERROR);
  }
}

public void update(Employee employee) {
  restServiceUtil.invokeUpdate(requestURI, employee);
}

public void create(Employee employee) {
  restServiceUtil.invokeCreate(requestURI, employee);
}

public void delete(Employee employee) {
  restServiceUtil.invokeDelete(requestURI + "/" + employee.getEmployeeId());
}

Crie o EmployeesPojoDC Data Control.
Vá ao painel Projects, clique com o botão direito no arquivo EmployeesPojoDC.java e escolha Create Data Control.
Na caixa de diálogo Create Bean Data Control, clique em Next e em Finish.

restjson-in-maf8

restjson-in-maf9

Abra o arquivo EmployeesTF.xml.
Vá para o painel Data Controls e expanda EmployeesPojoDC.
Arraste as operações FindAll, initEmployeeToAdd e initEmployeeToEdit e solte dentro da EmployeesTF.
Na caixa de diálogo Edit Action Binding, defina o valor de employee para #{pageFlowScope.employeeSelected}.

restjson-in-maf10

Arraste três componentes View e um Router e solte dentro da EmployeesTF.
Conecte-os usando o componente Flow Control Case.

restjson-in-maf11

Clique duas vezes em todos os componentes View e clique em OK para criar as AMX Pages.

restjson-in-maf12

Clique no componente Router e o configure como a imagem seguinte.

restjson-in-maf13

Abra a página EmpList.
Vá ao painel Data Control, arraste a coleção employees e solte dentro página como MAF List View.
Na ListView Gallery, clique em OK duas vezes.

restjson-in-maf14

restjson-in-maf15

Altere a página EmpList como a imagem seguinte.

restjson-in-maf16

Vá para Bindings e edite o employees binding.
Adicione lastName e firstName como Display Attributes.

restjson-in-maf17

Abra a página EmpDetail.
Vá ao painel Data Control, arraste a coleção employees e solte dentro página como MAF Read-only Form.
Na caixa de diálogo Edit Form Fields, clique em Ok.

restjson-in-maf18

Vá ao painel Data Control, arraste a operação delete e solte dentro do facet secondary como MAF Button.
Em Edit Action Binding, defina o valor de employee para #{bindings.employeesIterator.currentRow.dataProvider}.

restjson-in-maf19

Altere a página empDetail como a imagem seguinte.

restjson-in-maf20

Abra a página empEdit.
Vá ao painel Data Control, arraste o atributo estruturado employee e solte dentro da página como MAF Form.
Na caixa de diálogo Edit Form Fields, clique em Ok.

restjson-in-maf21

Vá ao painel Data Control, arraste as operações create e update e solte dentro do facet secondary como MAF Button.
Em Edit Action Binding, defina o valor de employee para #{bindings.employeeIterator.currentRow.dataProvider}.

restjson-in-maf22

restjson-in-maf23

Altere a página empEdit como a imagem seguinte.

restjson-in-maf24

Vá ao Painel Application Resources e expanda Descriptors > ADF META-INF.
Abra o arquivo connections.xml e mude o host para 10.0.2.2.
Android usa esse host para acessar o seu localhost.

restjson-in-maf25

Faça deploy do aplicativo e divirta-se!

restjson-in-maf26

restjson-in-maf27

Waslley Souza

Autor: Waslley Souza

Consultor Oracle com foco em tecnologias Oracle Fusion Middleware e SOA. Certificado Oracle WebCenter Portal, Oracle ADF e Java.

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *