Commit 6a22e796 by Patryk Czarnik

Obsługa różnych formatów w REST

parent 08f17d86
...@@ -62,6 +62,9 @@ public class Product { ...@@ -62,6 +62,9 @@ public class Product {
return description; return description;
} }
public void setDescription(String description) {
this.description = description;
}
@Override @Override
public int hashCode() { public int hashCode() {
......
...@@ -5,7 +5,9 @@ import java.util.Objects; ...@@ -5,7 +5,9 @@ import java.util.Objects;
import jakarta.xml.bind.annotation.XmlAttribute; import jakarta.xml.bind.annotation.XmlAttribute;
import jakarta.xml.bind.annotation.XmlElement; import jakarta.xml.bind.annotation.XmlElement;
import jakarta.xml.bind.annotation.XmlRootElement;
@XmlRootElement
public class Product { public class Product {
@XmlAttribute(name="id") @XmlAttribute(name="id")
private Integer productId; private Integer productId;
...@@ -62,6 +64,9 @@ public class Product { ...@@ -62,6 +64,9 @@ public class Product {
return description; return description;
} }
public void setDescription(String description) {
this.description = description;
}
@Override @Override
public int hashCode() { public int hashCode() {
......
...@@ -53,10 +53,10 @@ public class PhotoUtil { ...@@ -53,10 +53,10 @@ public class PhotoUtil {
e.printStackTrace(); e.printStackTrace();
} }
} }
private static Path getPath(int productId) throws DBException { private static Path getPath(int productId) throws DBException {
String dir = DBSettings.load().getProperty("photo_dir"); String dir = DBSettings.load().getProperty("photo_dir");
String fileName = productId + EXT; String fileName = productId + EXT;
return Paths.get(dir, fileName); return Paths.get(dir, fileName);
} }
} }
...@@ -21,7 +21,7 @@ import sklep.photo.PhotoUtil; ...@@ -21,7 +21,7 @@ import sklep.photo.PhotoUtil;
@Path("/products") @Path("/products")
public class RProduct { public class RProduct {
@GET @GET
@Produces("application/json") @Produces({"application/json", "application/xml", "text/plain"})
public List<Product> readAllProducts() throws DBException { public List<Product> readAllProducts() throws DBException {
try(DBConnection db = DBConnection.open()) { try(DBConnection db = DBConnection.open()) {
ProductDAO productDAO = db.productDAO(); ProductDAO productDAO = db.productDAO();
...@@ -31,7 +31,7 @@ public class RProduct { ...@@ -31,7 +31,7 @@ public class RProduct {
@GET @GET
@Path("/{id}") @Path("/{id}")
@Produces("application/json") @Produces({"application/json", "application/xml", "text/plain"})
public Product readOneProduct(@PathParam("id") int productId) throws DBException, RecordNotFound { public Product readOneProduct(@PathParam("id") int productId) throws DBException, RecordNotFound {
try(DBConnection db = DBConnection.open()) { try(DBConnection db = DBConnection.open()) {
ProductDAO productDAO = db.productDAO(); ProductDAO productDAO = db.productDAO();
...@@ -45,6 +45,7 @@ public class RProduct { ...@@ -45,6 +45,7 @@ public class RProduct {
// czyli nie wiemy, pod adresem zapisze się nowy produkt. // czyli nie wiemy, pod adresem zapisze się nowy produkt.
// POST potrafi "dodać rekord do katalogu". // POST potrafi "dodać rekord do katalogu".
@POST @POST
@Consumes({"application/json", "application/xml"})
public void saveProduct(Product product) throws DBException { public void saveProduct(Product product) throws DBException {
try(DBConnection db = DBConnection.open()) { try(DBConnection db = DBConnection.open()) {
ProductDAO productDAO = db.productDAO(); ProductDAO productDAO = db.productDAO();
...@@ -57,7 +58,7 @@ public class RProduct { ...@@ -57,7 +58,7 @@ public class RProduct {
// do poszczególnych pól obiektu (aby nie transferować całego rekordu, gdy potrzebna tylko jedna informacja) // do poszczególnych pól obiektu (aby nie transferować całego rekordu, gdy potrzebna tylko jedna informacja)
@GET @GET
@Path("/{id}/price") @Path("/{id}/price")
@Produces("application/json") @Produces({"application/json", "text/plain"})
public BigDecimal getPrice(@PathParam("id") int productId) throws DBException, RecordNotFound { public BigDecimal getPrice(@PathParam("id") int productId) throws DBException, RecordNotFound {
return readOneProduct(productId).getPrice(); return readOneProduct(productId).getPrice();
} }
...@@ -105,16 +106,16 @@ public class RProduct { ...@@ -105,16 +106,16 @@ public class RProduct {
@GET @GET
@Path("/{id}/photo") @Path("/{id}/photo")
// przykładowo /api/products/3/photo // przykładowo /products/3/photo
@Produces("image/jpeg") @Produces("image/jpeg")
public byte[] getPhoto(@PathParam("id") int productId) throws DBException, RecordNotFound { public byte[] getPhoto(@PathParam("id") int productId) throws DBException, RecordNotFound {
return PhotoUtil.readBytes(productId); return PhotoUtil.readBytes(productId);
} }
// @PUT @PUT
// @Path("/{id}/photo") @Path("/{id}/photo")
// @Consumes("image/jpeg") @Consumes("image/jpeg")
// public void writePhoto(@PathParam("id") int productId, byte[] bajty) { public void writePhoto(@PathParam("id") int productId, byte[] bajty) {
// PhotoUtil.writeBytes(productId, bajty); PhotoUtil.writeBytes(productId, bajty);
// } }
} }
package sklep.rest;
import java.math.BigDecimal;
import java.util.List;
import jakarta.ws.rs.Consumes;
import jakarta.ws.rs.DELETE;
import jakarta.ws.rs.GET;
import jakarta.ws.rs.POST;
import jakarta.ws.rs.PUT;
import jakarta.ws.rs.Path;
import jakarta.ws.rs.PathParam;
import jakarta.ws.rs.Produces;
import sklep.db.DBConnection;
import sklep.db.DBException;
import sklep.db.ProductDAO;
import sklep.db.RecordNotFound;
import sklep.model.Product;
import sklep.photo.PhotoUtil;
@Path("/products.json")
// na poziomie klasy można podać domyślne wartości Produces i Consumes dla wszystkich metod
@Produces("application/json")
@Consumes("application/json")
public class RProductJSON {
@GET
public List<Product> readAllProducts() throws DBException {
try(DBConnection db = DBConnection.open()) {
ProductDAO productDAO = db.productDAO();
return productDAO.readAll();
}
}
@GET
@Path("/{id}")
public Product readOneProduct(@PathParam("id") int productId) throws DBException, RecordNotFound {
try(DBConnection db = DBConnection.open()) {
ProductDAO productDAO = db.productDAO();
return productDAO.findById(productId);
}
}
@POST
public void saveProduct(Product product) throws DBException {
try(DBConnection db = DBConnection.open()) {
ProductDAO productDAO = db.productDAO();
productDAO.save(product);
db.commit();
}
}
@GET
@Path("/{id}/price")
public BigDecimal getPrice(@PathParam("id") int productId) throws DBException, RecordNotFound {
return readOneProduct(productId).getPrice();
}
@PUT
@Path("/{id}/price")
public void setPrice(@PathParam("id") int productId, BigDecimal newPrice) throws DBException, RecordNotFound {
try(DBConnection db = DBConnection.open()) {
ProductDAO productDAO = db.productDAO();
Product product = productDAO.findById(productId);
product.setPrice(newPrice);
productDAO.save(product);
db.commit();
}
}
@DELETE
@Path("/{id}")
public void usun(@PathParam("id") int productId) throws DBException, RecordNotFound {
try(DBConnection db = DBConnection.open()) {
ProductDAO productDAO = db.productDAO();
productDAO.delete(productId);
db.commit();
}
}
// Jeśli na poziomie metody użyjemy adnotacji @Produces lub @Consumes,
// to ustawienie metody nadpisuje ogólne ustawienie dla klasy
@GET
@Path("/{id}/photo")
@Produces("image/jpeg")
public byte[] getPhoto(@PathParam("id") int productId) throws DBException, RecordNotFound {
return PhotoUtil.readBytes(productId);
}
@PUT
@Path("/{id}/photo")
@Consumes("image/jpeg")
public void writePhoto(@PathParam("id") int productId, byte[] bajty) {
PhotoUtil.writeBytes(productId, bajty);
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment