1

I tried many examples I found here but none worked for me, I get error or a null object on the server side. This is on client side:

jsonManual = JSON.stringify(x);
alert('send data over: ' + jsonManual); //jasonManual is a valid json string, tested
$.ajax({
    type: "POST",
    url: "loccol", //loccol.java
    data: {jsonManual:jsonManual}, 
    dataType: "json",
    contentType: "application/json",
    success: function(data, textStatus, jqXHR){
        alert(data);
    },
    error: function(jqXHR, textStatus, errorThrown){
        alert("FAIL "+errorThrown);
    }
});

server side:

public class loccol extends HttpServlet {
private static final Logger log = LoggerFactory.getLogger(loccol.class);

protected void processRequest(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    response.setContentType("application/json;charset=UTF-8");
    PrintWriter out = null;

    try {
        List<LocationData> manual = new ArrayList<LocationData>();

        String jsonManual = request.getParameter("jsonManual");


        log.error("JsonManual inside servlet: " + jsonManual);

            ObjectMapper m = new ObjectMapper();
            JsonNode rootNode = m.readTree(jsonManual);  

            Iterator<JsonNode> sampleIt = rootNode.getElements();
            GeometryFactory gf = new GeometryFactory(new PrecisionModel(), 900913);
            while (sampleIt.hasNext()) {
                log.info("Starting next sample");
                JsonNode sample = sampleIt.next();
                LocationData ld = new LocationData();//Create new object
                if (sample.get("lon") != null && sample.get("lon").isDouble() &&
                           sample.get("lat") != null && sample.get("lat").isDouble()) {//We check if sample has lon and lat value
                    Coordinate c = new Coordinate(sample.get("lon").asDouble(), sample.get("lat").asDouble());
                    ld.setPoint(gf.createPoint(c));
                }
                if (sample.get("time") != null && sample.get("time").isLong()) {
                    ld.setTime(new Date(sample.get("time").asLong()));//Gets a string value
                }
                if (sample.get("floor") != null && sample.get("floor").isDouble()) {//We check if sample has lon-value
                    ld.setFloor(sample.get("floor").asDouble());//Gets a string value
                }
                if (sample.get("accuracy") != null && sample.get("accuracy").isDouble()) {//We check if sample has lon-value
                    ld.setAccuracy(sample.get("accuracy").asDouble());
                }
                if (sample.get("type") != null) {//We check if sample has lon-value
                    ld.setType(sample.get("type").asText());//Gets a string value
                }
                if (sample.get("speed") != null) {
                    ld.setSpeed(sample.get("speed").asDouble());
                }
                if (sample.get("direction") != null) {
                    ld.setSpeed(sample.get("direction").asDouble());
                }
                if (sample.get("SomethingThatDoesntExist") != null)  {
                    log.error("This example shows that you can safely check what values a sample has");
                }
                //manual.add(ld); log.info("manual add");
                manual.add(ld); 
                log.info("manual add");

            }
        for (int i = 0; i < manual.size(); i++) {
            log.info("type in manual sample "+i+": "+manual.get(i).getType());
        }
        int experimentId = SensorTracking.persistSamples(manual, null);
        out = response.getWriter();
        out.println("{\"experimentId\":"+experimentId+"}");

    } catch (Exception e) {
        e.printStackTrace();
        response.setStatus(500);            
    } finally {
        if (out != null) {
            out.close();
        }
    }
}


@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    processRequest(request, response);
}


@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
        throws ServletException, IOException {
    processRequest(request, response);
}

@Override
public String getServletInfo() {
    return "Short description";
}// </editor-fold>

}

9
  • can you show what jsonManual looks like please? Commented Nov 21, 2013 at 15:06
  • 1
    Try data: jsonManual and Content-Type: text/html and on server side request.getContent(). Commented Nov 21, 2013 at 15:07
  • @BharathRallapalli The double quotes don't make a difference in a JavaScript object literal. Commented Nov 21, 2013 at 15:07
  • Try printing request.getParameterMap() and see what you get. Commented Nov 21, 2013 at 15:12
  • 1
    check this stackoverflow.com/questions/3831680/… Commented Nov 21, 2013 at 15:13

1 Answer 1

3

Your mistake is here:

contentType: "application/json",

This is wrong. When you intend to use request.getParameter() and friends in the servlet, then it expects a content type of application/x-www-form-urlencoded, which happens to be the default content type of HTML <form> and jQuery $.ajax().

Just get rid of that wrong content type instruction.

Sign up to request clarification or add additional context in comments.

7 Comments

I tried a ton of different combinations! removing contenttype didn't solve it. when I replace post with get it works, but post gives me null
My answer is based on the information provided so far in the question (and the assumption that doPost() immediately calls processRequest()). If you have changed something in the code as compared to the code in the question, then there's indeed no guarantee that my answer is valid. At least, when I copypasted your code and removed the contentType option, then it works for me (as in: the parameter is not null). Any problem which you possibly encounter hereafter in the servlet code (e.g. parsing the obtained param as JSON) is completely unrelated and should be asked in a new question.
I meant before asking here I tried with and without contenttype and many other things, now with the same thing I posted here with the contenttype removed I still get null. same servlet.
Well, the problem is not visible in the information provided so far. It works for me. Didn't you said that GET works fine? Then perhaps your doPost() is wrong, e.g. for some unclear reason you called request.getReader() or getInputStream() in a blind attempt to solve it without actually understanding how stuff works. You should remove those method calls accessing the request body, otherwise getParameter() will stop working on POST. Again, my answer is based on the code posted so far in the question and the assumption that doPost() does nothing else than invoking processRequest()
Problem is not visible in code posted so far. Do you happen to have a servlet filter or anything else which invokes request.getReader() or request.getInputStream()? That would match the problem symptom of getParameter() returning null on POST but not on GET.
|

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.