Home > Software engineering >  Put method using a mapped class (use setters for specified parameter) - Spring boot API
Put method using a mapped class (use setters for specified parameter) - Spring boot API

Time:11-16

I'm trying to make a PUT request for an object using only one function for all parameters. Let's say I have this object structure (JSON):

{
  "id": 3,
  "name": "test",
  "dominio": "dom",
  "altas": "6",
  "bajas": "2",
  "default_group": [
     {
         "idRef": 1,
         "name": "Users",
         "path": "OU=es"
     }
  ],
  "office": [
     {
         "idRef": 1,
         "title": "Intern",
         "name": "CN=Office license",
         "path": "OU=licenseOffice"
     },
     {
         "idRef": 2,
         "title": "Specialist",
         "name": "CN=Office License F3",
         "path": "OU=LicenseGroupF"
     }
  ]
}

I managed to do this for a GET Request using a Map function with the getters of the class.

To do this, I passed the attribute name in the HTTP request using a GET Request:

Map<String, Function<Compania, Object>> mapCompania = Map.of(
        "name", Compania::getName,
        "dominio", Compania::getDominio,
        "altas", Compania::getAltas,
        "bajas", Compania::getBajas,
        "default_group", Compania::getDefault_group,
        "office", Compania::getOffice
);

Function<Compania, Object> retriever = mapCompania.get(fieldName);

But now, I can't find a way to implement this same thing but in order to use the setter methods. Something like:

PUT localhost/myClass/3/name --> it uses MyClass.setName(input...)

Or:

PUT localhost/myClass/3/office --> it uses MyClass.setOffice(Object office)

Could anyone help me to achieve this? Thank you very much

CodePudding user response:

Assuming that Compania is as follows:

public class Compania {
    private Object name;
    private Object dominio;
    private Object altas;
    private Object bajas;
    private Object default_group;
    private Object office;

    public Object getName() {
        return name;
    }

    public void setName(Object name) {
        this.name = name;
    }

    public Object getDominio() {
        return dominio;
    }

    public void setDominio(Object dominio) {
        this.dominio = dominio;
    }

    public Object getAltas() {
        return altas;
    }

    public void setAltas(Object altas) {
        this.altas = altas;
    }

    public Object getBajas() {
        return bajas;
    }

    public void setBajas(Object bajas) {
        this.bajas = bajas;
    }

    public Object getDefault_group() {
        return default_group;
    }

    public void setDefault_group(Object default_group) {
        this.default_group = default_group;
    }

    public Object getOffice() {
        return office;
    }

    public void setOffice(Object office) {
        this.office = office;
    }
}

The code below should do the trick:

Map<String, BiConsumer<Compania, Object>> mapCompaniaSetters = Map.of(
        "name", Compania::setName,
        "dominio", Compania::setDominio,
        "altas", Compania::setAltas,
        "bajas", Compania::setBajas,
        "default_group", Compania::setDefault_group,
        "office", Compania::setOffice
);
BiConsumer<Compania, Object> setter = mapCompaniaSetters.get(fieldName);

We can test this as follows to check that it actually works:

public static void main(String[] args) {
    Map<String, BiConsumer<Compania, Object>> mapCompaniaSetters = Map.of(
            "name", Compania::setName,
            "dominio", Compania::setDominio,
            "altas", Compania::setAltas,
            "bajas", Compania::setBajas,
            "default_group", Compania::setDefault_group,
            "office", Compania::setOffice
    );
    BiConsumer<Compania, Object> setter = mapCompaniaSetters.get("name");

    Compania compania = new Compania();
    System.out.println("Empty Compania: "   compania);
    setter.accept(compania, "Test");
    System.out.println("Compania with Name: "   compania);
}
  • Related