serwis www - JSON + Java + Hibernate

0

(na wstępie zaznaczam, że temat będzie dla wytrwałych, nie dla tego, że ciężki, tylko dlatego, że niespecjalnie wiem o czym w ogóle piszę, więc z góry przepraszam, jak bym przekręcał także znaczenia słów, których będę używał ;) Jestem na razie jak dziecko we mgle, używam rzeczy, których działania czasami nie rozumiem )

Próbuje zrobić prosty serwis, składający się z formularza html. Dane z formularza mają być zebrane za pomocą JS (o tym ewentualnie później), przekazane jako JSON i wrzucone do bazy przy pomocy Hibernate.

Powiedzmy, że w uproszczeniu moja baza o nazwie Card ma taką strukturę
id int() auto_increment
name varchar()
quantity double()

Przy pomocy 'reverse enegeenering wizard' w NetBeansie wygenerowałem klasę Card, która wyglądałaby mniej więcej tak:

 
public class Card  implements java.io.Serializable {

     private Integer id;
     private String name;
     private Double quantity; 

    public Card() {
    }

    public Card(String name, Double quantity) {
       this.name = name;
       this.quantity = quantity;
    }
   
//tu dalej są settery i gettery
}

W klasie obsługującej ziarna jest

    @POST
    @Consumes({MediaType.APPLICATION_JSON})
    @Produces({MediaType.TEXT_PLAIN})
    public String addMessage(Card fc) {
        
        System.out.println("Name = "+fc.getProductName());
        System.out.println("Quantity  = "+fc.getQuantityChecked());
        
        return "ok";
    }
 

Jeżeli wszystkie składowe klasy Card są String to nie ma problemu. Mam problem jak składowe są tak jak tutaj np. Double - wtedy dostaję zwrotkę 400 Bad request. W sumie logiczne, że jest błąd, w końcu po to jest typowanie. Problem rozwiązałem dodając przeciążony konstruktor i settera

    @JsonCreator
    public Card(@JsonProperty("productName") String productName, @JsonProperty("quantityChecked") String quantityChecked) {
        System.out.println("Wywołanie konstruktora @JasonProperty");
        setProductName(productName);
        setQuantityChecked(quantityChecked);
    }
    public void setQuantityChecked(String quantityChecked) {
        this.quantityChecked = Double.parseDouble(quantityChecked);
    }

Działać działa, pytanie czy tak się to robi?

EDIT:
mała poprawka, żeby nie było wątpliwości...raz napisałem quantity raz quantityChecked...wszędzie jest użyta jedna i ta sama nazwa, po prostu jak pisałem post, to część pisałem z ręki część kopiowałem.

EDIT2:
pół dnia sprawdzania, ale doszedłem do jeszcze jednego problemu, który nie wiem z czym jest związany. Chodzi o to, że jeżeli stworze w klasie Card dwie przeciążone metody zaczynające się od 'set' to automatycznie dostaję 400 Bad request.
Nie ma problemu jeżeli to będą np:
seetXyz(String s)
seetXyz(Integer i)
jeżeli metody mają nazwę zaczynającą się od set to coś się sypie. Jeżeli jest tylko jedna z nich (obojętnie która) to nie ma problemu.

0

Ogólnie zapewne korzystasz z Jacksona. Jest on na tyle inteligentny, że jak jak w modelu masz metodę setOneTwo, to on się skapnie, że chcesz jej użyć żeby ustawić pole o nazwie oneTwo. Bad request oznacza właśnie tyle że źle przesyłasz dane z frontu - najczęściej jest to problem z paylodem, czyli ciałem body requestu HTTP. Co do problemów z doublami - struktura JSonów jest taka, że jako key masz property w cudzysłowie, a value masz w cudzysłowie lub bez (jeśli nie jest stringiem). Czyli np u ciebie przykładowy payload:

 
{
  "id": 2,
  "name": "some name",
  "quantity": 2.2
}
0

Tak myślałem, ale nie do końca rozumiem jak to w ogóle działa :) OK, czyli zakładam, że nie ma opcji, żeby w tym wypadku używać przeciążonych metod. Powinienem sprawdzić dane po stronie usera (JS w przeglądarce) i załadować dopiero wtedy do JSONa i przesłać. To mi generuje kolejny problem :) bo korzystam ze skryptu JS do serializacji, ale wynik dostaję niestety w formacie "nazwa":"1" - ale poszukam na to rozwiązania, jak nie znajdę to wrócę :)
Dzięki za pomoc.

1 użytkowników online, w tym zalogowanych: 0, gości: 1