How to use "?" no get Path Rest? - java

I am developing a rest server in java, netbeans.
I have my GET request:
//myip/application/v1/cardapio/id=1
#Stateless
#Path("v1/cardapio")
public class CardapioResource {
#GET
#Produces("application/json")
#Path("id={id}")
public String getCardapio(#PathParam("id") int id) {
JsonArray array = (JsonArray) gson.toJsonTree(ejb.findById(id));
JsonObject obj = new JsonObject();
obj.add("dados", array);
return obj.toString();
}
}
It works correctly.
But I want to do differently, as I saw in other examples, I want to mark the beginning of the variables with the "?".
Ex: //myip/application/v1/cardapio/?id=1
#Stateless
#Path("v1/cardapio")
public class CardapioResource {
#GET
#Produces("application/json")
#Path("?id={id}")
public String getCardapio(#PathParam("id") int id) {
JsonArray array = (JsonArray) gson.toJsonTree(ejb.findById(id));
JsonObject obj = new JsonObject();
obj.add("dados", array);
return obj.toString();
}
}
Thus error 404, page not found.

What you seen in "other examples" is just normal usage of URL's query part. Just use it with #Queryparam
#Stateless
#Path("v1/cardapio")
public class CardapioResource {
#GET
#Produces("application/json")
#Path("/") // can be removed actually
public String getCardapio(#QueryParam("id") int id) {
JsonArray array = (JsonArray) gson.toJsonTree(ejb.findById(id));
JsonObject obj = new JsonObject();
obj.add("dados", array);
return obj.toString();
}
}
Here you are mapping getCardapio to v1/cardapio/ and you will try to get id from query string so
Ex: //myip/application/v1/cardapio/?id=1
will just work.

You can't, after ? sign it's query parameters and not path parameters
You can use #QueryParam("id")

You can also use
#RequestParam("id") int id

Related

How to change the key of JSONArray in java

JSON received by POST from the front end
[{"id":"001","name":"James"},{"id":"002","name":"Emma"}]
I want to change the key of the received JSON and return it.
[{"ID":"001","FirstName":"James"},{"ID":"002","FirstName":"Emma"}]
#RestController
#RequestMapping("/test")
public class TestController{
#RequestMapping(value="/test1", method=RequestMethod.POST)
public List<Object> post (#RequestBody List<TestDto> list){
JSONArray jArray = new JSONArray(list);
//I want to add a process to change the JSON key here
.......
return jArray.toList();
}
}
I would parse it to a string using
String s = new ObjectMapper().mapper.writeValueAsString(list);
s.replace("id","ID") ;
and return new JSONObject(string);

Getting volley response in another class

I made the first request successfully and I like to access my Volley response in other class , how can I do that because when I try to do that it return a null response
use interface and callback
public interface RestCallBack {
void onStart(String action);
void onComplete(String response, String action,Exception e);
}
And in your onResponse
listener.onComplete(response, action, null);
Then you can implement this interface in any class where you want the response.
At first its depends on your json data formate .......
You need to create a class
Declare a method in your class with a parameter string or array and call this method where you get json response
or follow this code
public class MyJsonParser {
public static Vector<MyModel> getJsonResponse(Context context,String response)
throws JSONException, IOException
{
final JSONObject stringResponse = new JSONObject(response);
final JSONObject responseHolder = stringResponse.getJSONObject("data");
final JSONArray jsonArray = responseHolder .getJSONArray("arrayData");
MyModel myModel;
Vector<MyModel> myArray = new Vector<MyModel>();
for (int i= 0;i<jsonArray .length();i++){
myModel= new MyModel();
JSONObject propertyHolder = jsonArray .getJSONObject(i);
myModel.setId(propertyHolder,"id");
myModel.setName(propertyHolder, "name");
myArray .addElement(myModel);
myModel= null;
}
return myArray ;
}
}
and call this method where you get json response like this....
MyJsonParser.getJsonResponse(context,response);

How to send json ouput from servlet to jsp?

I'm making an inventory control. I was trying to check if the entered quantity of item is less than the stock quantity or not. I'm getting the servet json output. But I can't send it to jsp back.
Jsp JQuery code.
<script>
$('document').ready(function() {
$('#submit_btn').click((function() {
var $name = $("select#item_name").val();
var $qty = $("input#qty").val();
$.post('BuyItem', {item_name: $name, item_qty: $qty}, function(data) {
if (data !== null) {
alert(text(data));
$("input#qty").val("");
} else {
alert("Invalid Item!");
}
}
);
}));
});
</script>
And this is servlet query.
while (rs.next()) {
if (rs.getInt("qty") > qty) {
int id = rs.getInt("item_id");
Gson gson = new Gson();
String json = gson.toJson(id);
// System.out.println("one" + json);
response.setContentType("application/json");
// response.setCharacterEncoding("UTF-8");
response.getWriter().print(json);
} else {
Gson gson = new Gson();
String json = gson.toJson("Stock doesn\'t have enough item quantity.");
// System.out.println("two" + json);
response.setContentType("application/json");
// response.setCharacterEncoding("UTF-8");
response.getWriter().print(json);
}
}
From both System.out.println() s output is always coming correctly. But not sending to jsp back. Please help me with this.
what you have to do and also a best practice is to create a DTO class with the properties that you need to pass to gson library.
public class ResponseDTO implements Serializable{
private Integer id;
//more properties ...
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id= id;
}
// other getters & setters
}
and inside your loop, set the values to the dto object, then pass it to gson.
Gson gson = new Gson();
ResponseDTO dto = null;
String json = "";
response.setContentType("application/json");
......
if (rs.getInt("qty") > qty) {
dto = new ResponseDTO();
int id = rs.getInt("item_id");
dto.setId(id);
......
json = gson.toJson(dto);
} else {
...... // similar
json = gson.toJson("{data: 'Some message'}");
}
response.getWriter().print(json);
gson will give you the proper json structure to the client side.
try and see !
Gson allows strings and numbers to serialize to JSON by themselves (which is probably ok by the definition), but a lot of other libraries would consider this invalid JSON.
Try wrapping your response in an object so that the response is {"id": 5} and not just 5.

anybody can correct this code?

#GET
#Produces(MediaType.APPLICATION_JSON)
public List<ProductData> getAllProductList(#QueryParam("hotel_id") int hotel_id) throws SQLException{
System.out.println("Hotel id id==="+hotel_id);
ProductData productData=new ProductData();
List<ProductData> products = new ArrayList<ProductData>();
rs=stmt.executeQuery("select * from products where hotel_id="+hotel_id);
while(rs.next()){
productData.setProductName(rs.getString("name"));
productData.setProductCategory(rs.getString("category"));
productData.setProductRate(rs.getDouble("rate"));
productData.setProductLogoPath(rs.getString("productLogoPath"));
products.add(productData);
}
return products;
}
I have passed List as JsonObject.Now i tried to get List value like
void handleResponse(String response) throws JSONException {
JSONObject jsonObject=new JSONObject(response);
JSONArray jsonArray = jsonObject.getJSONArray("products");
}
but i can't get the List value.anyBody can help me?
There is the simple way to convert json string to object :
Try this :
ObjectMapper mapper = new ObjectMapper();
POJO obj = mapper.readValue(yourJSONString, POJO.class);
Use method signature something similar like-
public Response getAllProduct..
&
return like-
return Response.status(Status.OK).entity(products).build();
For intg. layer use-
public ClientResponse<> similarSignatureMethod..
&
call via the client and then get response entity as-
clientResponse.getEntity();

How do I sort JSONObjects in an JSONArray in Java (Server side)?

#GET
#Produces("application/json")
#Consumes("application/json")
#Path("/getStuff/{id}")
public String getStuff(
#PathParam("id") String id,
#Context HttpServletRequest request,
#Context HttpServletResponse response) throws Exception
{
Collection<Stuff> stuff = Manager.getStuff().values();
JSONArray jArray = new JSONArray();
for (Stuff i : stuff)
{
jsnObjct.put("id", i.getId());
jsnObjct.put("name", i.getName());
jArray.add(jsnObjct);
}
json = jArray.toString();
response.setContentType("text/javascript");
response.getOutputStream().print(json);
response.flushBuffer();
return null;
}
I'm guessing that you're using the net.sf.json library for this? If so, I'd try something like the following. I don't know for sure if this would work, but if it does work it will be by far the easiest approach. Unfortunately I'm not too familiar with that library so I'm not sure of the exact details (you may be able to skip the creation of a second JSONArray - not sure if add(int, Object) pushes objects down or overwrites them):
Object[] myArray = jArray.toArray();
myArray = Arrays.sort(myArray);
JSONArray sortedJArray = new JSONArray();
for (Object obj : myArray) {
sortedJArray.add(obj);
}

Categories