How to use Spring 4 Rest Controller to serve for J

2019-06-06 02:56发布

问题:

I have created Spring 4 project for building rest services. So I have created more then 50 rest services, now the requirement came to create web-app for the same. So I want to reuse the same controller, so that I just have to write view(JSP) code only.

For the same I googled and found http://www.mkyong.com/spring-mvc/spring-3-mvc-contentnegotiatingviewresolver-example/ but this gives me an error. Morover my project structure is below.

So where I need to write this config in servlet-context.xml? What is the best way to achieve and how?

Mainly I need ouput in Json and html only. So its fine my http request have an extension .json and .jsp.

Below is code of one of my controller. Below is the way I have created Rest service, now I want this same method to server for JSP pages.

    package com.alumini.spring.controller;

import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.alumini.spring.DAO.CourseDAO;
import com.alumini.spring.model.Alumini;
import com.alumini.spring.model.Course;

@RestController
public class CourseController {

    @Autowired
    private CourseDAO courseDao;

    @RequestMapping(value = "/getCourseList")
    public List<Course> getCourseList(@RequestParam("email") String email,@RequestParam("password") String password) {
        List<Course> listCourse = courseDao.list();
        List<Course> finalList= new ArrayList<Course>();
        for(Course course: listCourse) {
            finalList.add(course);          
        }
        return finalList;
    }

}

Please help me, if any of you have done that earlier?

回答1:

package com.apmc.rest;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.codehaus.jackson.map.ObjectMapper;
import org.hibernate.SessionFactory;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
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.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import com.apmc.Generic.CommonMethods;
import com.apmc.domain.Auction;
import com.apmc.domain.Commodity;
import com.apmc.jsonObjectMaker.GetEntryDetails;
import com.apmc.services.AuctionService;
import com.apmc.services.CommodityService;

@RestController
@RequestMapping("auction")
public class RestAuctionController {

	List<Object[]> show_egp_for_auction;
	String successMsg = "";
	String errorMsg = "";
	List<Commodity> listOfComm;
	private List<Object[]> show_details_trd;
	JSONObject msg;
	
	@Autowired
	AuctionService auctionService;
	
	@Autowired
	CommodityService commodityService;
	
	@RequestMapping(value="/commoditySelect", method = RequestMethod.GET, headers="Accept=application/json")
	public String commSelect() {
		listOfComm = new ArrayList<Commodity>();
		try {
			listOfComm = commodityService.loadAll();
			SessionFactory commSessionFactory = commodityService.getThisSessionFactory();
			
			Map<String, String> map = new HashMap<String, String>();
			map.put("comm_id", "getComm_id");
			map.put("comm_name", "getComm_name");
			
			JSONObject comm_json_Obj = CommonMethods.getJSONFromList(Commodity.class, listOfComm, commSessionFactory, "commodities", map);
			
			return  comm_json_Obj.toString();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return  null;
		}
		
	}
	
	@RequestMapping(value = "/auctionByEntryGatePass", method = RequestMethod.POST, produces="application/json", consumes="application/json")
	public @ResponseBody String check_egp(@RequestBody String json)
	{
	    
	    try {
			show_egp_for_auction = new ArrayList<Object[]>();
			
			JSONObject egp_no_json = new JSONObject(json);
						
			String egp_no = (String) egp_no_json.get("egp_no");
			Long comm_id = Long.parseLong(egp_no_json.get("comm_id").toString());
			String comm_name = (String) egp_no_json.get("comm_name");
			
			if(egp_no.isEmpty()) {
				successMsg = "";
				errorMsg = "Data is remaining or wrong.";
				msg = new JSONObject();
				msg.put("errorMsg", errorMsg);
				msg.put("egp_no_error", "Please enter Entry Gate Pass Number");
				return msg.toString();
			}
			
			show_egp_for_auction = auctionService.egp_info_for_auction(egp_no, comm_id);
			successMsg = "";
			errorMsg = "";
			
			if(show_egp_for_auction.size() == 0) {
				errorMsg = "This is not a valid entry gate pass either This entry gate pass have not this commodity.";
			}	else if(show_egp_for_auction.get(0)[7] != null)	{
				errorMsg = "This commodity have already auctioned.";
			}	else if(show_egp_for_auction.size() > 1) {
				errorMsg = " New tolmapEntrybyEntryGatePass Error \n Please contact Admin and errorcode: ";
			}	else {
				errorMsg = "";	
				successMsg = "Success";
			}
			msg = new JSONObject();
			msg.put("successMsg", successMsg);
			msg.put("errorMsg", errorMsg);
			
			if(errorMsg.isEmpty()) {
				
		        GetEntryDetails GetEntryDetailsForAuc = new GetEntryDetails(comm_name,
		        													  show_egp_for_auction.get(0)[0].toString(),
		        													  show_egp_for_auction.get(0)[5].toString(),
		        													  show_egp_for_auction.get(0)[4].toString(),
		        													  show_egp_for_auction.get(0)[2].toString(),
		        													  show_egp_for_auction.get(0)[3].toString());
		        													   
		       // return new ResponseEntity(HttpStatus.CREATED);
		        JSONArray egp_details = new JSONArray();
		        egp_details.put(msg);
		        egp_details.put(GetEntryDetailsForAuc.getJSON());
				return egp_details.toString();  
			}	else {
				return msg.toString();
			}
			
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			return "ERROR";  
		}
	}
	
	@RequestMapping(value = "/auction_confirm", method = RequestMethod.POST, produces="application/json", consumes="application/json")
	public @ResponseBody String auctionConfirm(@RequestBody String auction_json)
	{
		successMsg = "";
		errorMsg = "";
		Long auc_trd_no;
		Double auc_commRate;
		
		JSONObject auction = new JSONObject(auction_json);
		
		String auc_trd_no_error = "";
		String auc_commRate_error = "";
		Object a = auction.get("auc_trd_no");
		Object b = auction.get("auc_commRate");
		
		if(auction.get("auc_trd_no").toString().isEmpty()) {
			auc_trd_no = 0l;
		} else {
			try {
				auc_trd_no = Long.parseLong(auction.get("auc_trd_no").toString());
			}   catch (NumberFormatException nfe) {
				auc_trd_no = 0l;
			}
		}
		
		if(auction.get("auc_commRate").toString().isEmpty()) {
			auc_commRate = 0d;
		} else {
			try {
				auc_commRate = Double.parseDouble(auction.get("auc_commRate").toString());
			}  catch(NumberFormatException nfe) {
				auc_commRate = 0d;
			}
			
		}
		
		int error_counter = 0;
		boolean auc_mul_comm = false;
		
		if(auc_commRate == 0d)  {
			successMsg = "";
			errorMsg = "Data is remaining or wrong.";
			auc_commRate_error = "Please enter Auction Commodity Rate or enter valid Auction Commodity Rate.";
			error_counter = 1;
		}	
		
		if(auc_trd_no == 0l)  {
			successMsg = "";
			errorMsg = "Data is remaining or wrong.";
			auc_trd_no_error = "Please enter Trader Id Number or enter valid Trader Id Number.";
			error_counter = 1;
		}
		
		if(error_counter == 1)	{
			msg = new JSONObject();
			msg.put("errorMsg", errorMsg);
			msg.put("auc_trd_no_error", auc_trd_no_error);
			msg.put("auc_commRate_error", auc_commRate_error);
			
			return msg.toString();
		}	else {
			
			
			try {
				
					show_details_trd = new ArrayList<Object[]>();
					show_details_trd = auctionService.trd_check(auc_trd_no);
					//logger.info("\n\n\n\n\n\n");
					//logger.info(show_egp.get(0)[6].toString());
					//logger.info(show_egp+"    : "+show_egp.size());
					if(show_details_trd.size() == 0) {
						errorMsg = "This is not a valid Trader's Id number.";
					}	else if(show_details_trd.size() > 1) {
						errorMsg = " New tolmapEntrybyEntryGatePass Error \n Please contact Admin  ";
					}	else {
						errorMsg = "";	
					}
					
					if(errorMsg != "") {
						successMsg = "";
						auc_trd_no_error = "";
						auc_commRate_error = "";
						
						msg = new JSONObject();
						msg.put("errorMsg", errorMsg);
						return msg.toString();
						
					}
				} catch (Exception e) {
					// TODO Auto-generated catch block
					msg = new JSONObject();
					msg.put("errorMsg", e.getMessage());
					return msg.toString();
				}
			
			successMsg = "Entry Gate Pass submitted successfully.";
			errorMsg = "";
			auc_trd_no_error = "";
			auc_commRate_error = "";
			msg = new JSONObject();
			msg.put("successMsg", successMsg);
			return msg.toString();
		}
	}
	
	@RequestMapping(value = "/auction_add", method = RequestMethod.POST, produces="application/json", consumes="application/json")
	public @ResponseBody String saveOrUpdateAuction(@RequestBody String auction_json)
	{
		 try {
			 	String pattern = "yyyy-MM-dd HH:mm:ss";
			    SimpleDateFormat df = new SimpleDateFormat(pattern);
			    ObjectMapper objMapper = new ObjectMapper();
			    objMapper.setDateFormat(df);
			    
			 	Auction auction = (Auction)objMapper.readValue(auction_json, Auction.class);
			 			                   
				auctionService.saveOrUpdate(auction, false);
				successMsg = "Auctioned Successfully.";
				errorMsg = "";
				msg = new JSONObject();
				msg.put("successMsg", successMsg);
				return msg.toString();
			}  catch(JSONException je) { 
				je.printStackTrace();
				successMsg = "";
				errorMsg = je.getMessage();
				msg = new JSONObject();
				msg.put("errorMsg", errorMsg);
				return msg.toString();
			}  catch (Exception e) {
				e.printStackTrace();
				successMsg = "";
				errorMsg = e.getMessage();
				msg = new JSONObject();
				msg.put("errorMsg", errorMsg);
				return msg.toString();
			}
	}
	
}



回答2:

Like @Sotirios Delimanolis said here :

You shouldn't. A @RestController is not meant to return views. It's meant to return something that will be written to the response body directly.

If you really have to, you can declare your method to have a return type of View or ModelAndView and return the appropriate object, with an identifying view name.