(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.