0

I have an application where I am using ModelAndView in conjuction with JQWidget, AJAX calls to the controller for insert / updates.

My problem is the Update AJAX call doesn't invoke update method in the controller, it actually invokes the method which shows the MVC form.

On different versions of browsers it works but on some when /forecast/update.do is called the controller method with Requestmapping edit.view i.e. updateForecastForm is called instead of updateForecast

I am explaining through my code below.

Thanks, Vicky

Part of AddFore.js

$(document).ready(function(){
	theme = getDemoTheme();

	// Get Current Date & User 
	var currentUser = "AUSER";
	
 
	
	/* Edit a Customer - ed_save button event - Start */
	var editSave = function(){
//		alert(" Updating");		
		$("#ed_save").attr("disabled","disabled");
		$("#waitText4").text('Please wait ... ');
		$("#ed_save").css('cursor','progress');
		
		var arr = [];
		var contactRows = rowCount; // $(".ed_temp_contact").length;
	//	alert("ss " + contactRows);
		for (var count=1; count<=contactRows; count++){	// count=0 is changed to count=1 because blank row which comes by default is deleted 
			var forecastdetail = { 
					productId: $("#rowList"+count+" [id~='productId']").val(),
					forecastDate: new Date($("#rowList"+count+" [id~='forecastDate']").val()),
					qty: $("#rowList"+count+" [name~='qty']").val(),
					price: $("#rowList"+count+" [name~='price']").val(),
					status: $("#status").val()
			};

			arr.push(forecastdetail);
		}		

		var poDate = new Date($("#poYear").val(), $("#poMonth").val()-1, '01');
		var addToCall = new Date($("#callYear").val(), $("#callMonth").val()-1, '01');		
		var formElements = new Object({
			forecastId: $("#forecastId").val(),
			forecastTitle: $("#forecastTitle").val(), 			
			stage: $("#stage").val(),
			customerId: $("#customer").val(),
			lanWan: 'N',
			notes: $("#notes").val(),			
			poDate: poDate,
			dateAddedToCall: addToCall, 
			lastReviewed: currentDate,
			status: $("#status").val(),
			createdBy: $("#createdBy").val(),
			createdOn: new Date($("#createdOn").val()),			
			updatedBy: currentUser,
			updatedOn: currentDate,			
			forecastDetails: arr
		});
		var updateURL = contextPath+'/forecast/update.do';
		alert(" Updating Opportunity * " + updateURL);		
		$.ajax({
			type: 'POST',
			url: updateURL,
			dataType: 'json',
			contentType: "application/json; charset=utf-8",
			data: JSON.stringify(formElements),
			success : function(data, textStatus, jqXHR) {
				alert(" Opportunity Updated.");				
				$("#ed_save").removeAttr("disabled","disabled");
				$("#waitText4").text('Save successful...');
				hideAndFade("#waitText4");
				$("#ed_save").css('cursor','pointer');
				
                $("#popupWindow").jqxWindow('hide');
              //  fetchAllRecords();
			},
			error : function(jqXHR, textStatus, errorThrown) {
				// alert(" Opportunity Not Updated.");					
				console.log('error:', errorThrown);
				$("#ed_save").removeAttr("disabled","disabled");
				$("#waitText4").text('Save failed : '+errorThrown);
				hideAndFade("#waitText4");
				$("#ed_save").css('cursor','pointer');
			}
		});
	};

Now the controller:

  package com.tantalus.salesfunnel.controller;

import java.util.List;

import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Required;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import com.tantalus.salesfunnel.model.FCustomer;
import com.tantalus.salesfunnel.model.Forecast;
import com.tantalus.salesfunnel.model.ForecastReference;
import com.tantalus.salesfunnel.model.FProduct;
import com.tantalus.salesfunnel.model.ResponseObject;
import com.tantalus.salesfunnel.service.ICustomerService;
import com.tantalus.salesfunnel.service.IForecastService;
import com.tantalus.salesfunnel.service.IProductService;
import com.tantalus.salesfunnel.service.IReferenceService;

@Controller
public class ForecastController {
	Logger logger = Logger.getLogger(ForecastController.class);
	
	private IForecastService forecastService;
	private ICustomerService customerService;
	private IProductService  productService;
	private IReferenceService  refService;

	public IForecastService getIForecastService() {
		return forecastService;
	}

	@Autowired
	@Required
	public void setForecastService(IForecastService forecastService) {
		this.forecastService = forecastService;
	}
	
	public ICustomerService getCustomerService() {
		return customerService;
	}

	@Autowired
	@Required
	public void setCustomerService(ICustomerService customerService) {
		this.customerService = customerService;
	}
	
	public IProductService getProductService() {
		return productService;
	}

	@Autowired
	@Required
	public void setProductService(IProductService productService) {
		this.productService = productService;
	}	
	
	public IReferenceService getRefService() {
		return refService;
	}

	@Autowired
	@Required
	public void setRefService(IReferenceService refService) {
		this.refService = refService;
	}
	 
	@RequestMapping(value="/forecast/add.view", method= {RequestMethod.POST, RequestMethod.GET}, headers="Accept=application/json")
	public ModelAndView addForecastForm () throws Exception {
		System.out.println(" Inside /forecast/add.view ");
		logger.debug("Inside addForecast.view");
		ModelAndView mv = new ModelAndView("AddForecast");		
		Forecast f = new Forecast(); // forecastService.getForecast(customerName);
		mv.addObject("AddForecast", f);
		doCommon(mv);
		return mv; 
	}
	
	@RequestMapping(value="/forecast/add.do", method = {RequestMethod.POST, RequestMethod.GET})
	@ResponseBody	
	public boolean addForecast(@RequestBody Forecast forecast) throws Exception {
		System.out.println(" Inside /forecast/add.do ");
		forecastService.addForecast(forecast);
		return true;		
	} 	
	
	 
	@RequestMapping(value="/forecast/edit.view", method= {RequestMethod.POST, RequestMethod.GET}, headers="Accept=application/json")
	public ModelAndView editForecast (@RequestParam(value="forecastId", required=false) int forecastId) {
		System.out.println(" Inside /forecast/edit.view ");
		logger.debug("Inside /forecast/edit.view");
		ModelAndView mv = new ModelAndView("AddForecast");
		Forecast forecast = new Forecast();		
		forecast = forecastService.getForecast(forecastId);
		mv.addObject("forecast", forecast);
		doCommon(mv);
		return mv; 
	}
	
	@RequestMapping(value="/forecast/search.view", method = RequestMethod.GET)
    public @ResponseBody Forecast getForecast(@RequestParam("forecastId") int forecastId) {
		System.out.println(" Inside search.view " + forecastId);			
        logger.info("Start search.view= "+ forecastId); 
        Forecast f = forecastService.getForecast(forecastId);
        return f;
    }			
	
	@RequestMapping(value="/forecast/update.do", method = {RequestMethod.POST, RequestMethod.GET})
	@ResponseBody	
	public boolean updateForecast(@RequestBody Forecast forecast) throws Exception {
		System.out.println(" Inside /forecast/update.do ");
		forecastService.updateForecast(forecast);
		return true;		
	} 		

	@RequestMapping(value="/forecast/refresh.do", method=RequestMethod.GET)
	@ResponseBody
	public boolean refreshList() throws Exception {
		forecastService.refreshList();
		return true;
	}
	
	@RequestMapping(value="/forecast/list2.view", method=RequestMethod.GET)
	public @ResponseBody ResponseObject<Forecast> listForecast2 () {
//		logger.debug("Inside listForecasts");
		ResponseObject<Forecast> forecasts = forecastService.getAllForecasts(0, 100);
		return forecasts;
	}	

	private void doCommon(ModelAndView mv) {
		ResponseObject<FCustomer> customers = customerService.getAllCustomers(0, 100, 0);
		List<FCustomer> custList = customers.getListOfModels();
		mv.addObject("custList", custList);
		
		List<FProduct> productList = productService.getProducts("");
		mv.addObject("productList", productList);
		
		List<ForecastReference> stageList = refService.getRefs("OPP_STAGE");
		mv.addObject("stageList", stageList);	
	}
	
	
	
}

5
  • Why do you have a single controller method supporting both GET and POST requests for your update? Try removing the GET mapping and see if you still have the problem. Commented Oct 2, 2014 at 1:12
  • I have GET AND POST intentionally on a single method, otherwise I get a message saying GET or POST not supported. Commented Oct 2, 2014 at 17:21
  • When I made two methods out of one i.e. one doing GET and other POST then while updating I get this message from POST methos. HTTP Status 415 -The server refused this request because the request entity is in a format not supported by the requested resource for the requested method. Commented Oct 2, 2014 at 17:47
  • Short answer: probably JSON processing issues. I actually recently asked and answered a question whose content might help you. Take a look at my solution and the linked questions: stackoverflow.com/questions/25554373/… Commented Oct 2, 2014 at 19:16
  • This is actually solved by me. It has to do with asynchronize calls by javascript, so adding this code to AJAX calls worked async : false Commented Feb 13, 2015 at 22:32

2 Answers 2

0

I am not sure how your code works if you have

headers="Accept=application/json"

it should be

headers="Accept:application/json"

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

1 Comment

No this is right code, check ibm.com/developerworks/library/wa-restful
0

This is actually solved by me. It has to do with asynchronize calls by javascript, so adding this code to AJAX calls worked

async : false 

Comments

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.