2016-11-07 2 views
2
I have a Spring MVC aplication. I want to convert it to a RESTful 

webservice, который возвращает ответ JSON. Может кто-нибудь мне помочь с этим?Spring MVC to REST

В основном, я хочу преобразовать контроллер в контроллер REST.

Мой код:

/////////////////////////// PersonController /////////// ///////////////////

package com.journaldev.spring; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.annotation.Qualifier; 
import org.springframework.stereotype.Controller; 
import org.springframework.ui.Model; 
import org.springframework.web.bind.annotation.ModelAttribute; 
import org.springframework.web.bind.annotation.PathVariable; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 

import com.journaldev.spring.model.Person; 
import com.journaldev.spring.service.PersonService; 

@Controller 
public class PersonController { 

    private PersonService personService; 

    @Autowired(required=true) 
    @Qualifier(value="personService") 
    public void setPersonService(PersonService ps){ 
     this.personService = ps; 
    } 

    @RequestMapping(value = "/persons", method = RequestMethod.GET) 
    public String listPersons(Model model) { 
     model.addAttribute("person", new Person()); 
     model.addAttribute("listPersons", this.personService.listPersons()); 
     return "person"; 
    } 

    //For add and update person both 
    @RequestMapping(value= "/person/add", method = RequestMethod.POST) 
    public String addPerson(@ModelAttribute("person") Person p){ 

     if(p.getId() == 0){ 
      //new person, add it 
      this.personService.addPerson(p); 
     }else{ 
      //existing person, call update 
      this.personService.updatePerson(p); 
     } 

     return "redirect:/persons"; 

    } 

    @RequestMapping("/remove/{id}") 
    public String removePerson(@PathVariable("id") int id){ 

     this.personService.removePerson(id); 
     return "redirect:/persons"; 
    } 

    @RequestMapping("/edit/{id}") 
    public String editPerson(@PathVariable("id") int id, Model model){ 
     model.addAttribute("person", this.personService.getPersonById(id)); 
     model.addAttribute("listPersons", this.personService.listPersons()); 
     return "person"; 
    } 

} 

//////////////////////// ///////// PersonDAO /////////////////////////////

package com.journaldev.spring.dao; 

import java.util.List; 

import com.journaldev.spring.model.Person; 

public interface PersonDAO { 

    public void addPerson(Person p); 
    public void updatePerson(Person p); 
    public List<Person> listPersons(); 
    public Person getPersonById(int id); 
    public void removePerson(int id); 
} 

//// /////////////////////////// PersonDAOImpl ////////////////////// ///

package com.journaldev.spring.dao; 

import java.util.List; 

import org.hibernate.Session; 
import org.hibernate.SessionFactory; 
import org.slf4j.Logger; 
import org.slf4j.LoggerFactory; 
import org.springframework.stereotype.Repository; 

import com.journaldev.spring.model.Person; 

@Repository 
public class PersonDAOImpl implements PersonDAO { 

    private static final Logger logger = LoggerFactory.getLogger(PersonDAOImpl.class); 

    private SessionFactory sessionFactory; 

    public void setSessionFactory(SessionFactory sf){ 
     this.sessionFactory = sf; 
    } 

    @Override 
    public void addPerson(Person p) { 
     Session session = this.sessionFactory.getCurrentSession(); 
     session.persist(p); 
     logger.info("Person saved successfully, Person Details="+p); 
    } 

    @Override 
    public void updatePerson(Person p) { 
     Session session = this.sessionFactory.getCurrentSession(); 
     session.update(p); 
     logger.info("Person updated successfully, Person Details="+p); 
    } 

    @SuppressWarnings("unchecked") 
    @Override 
    public List<Person> listPersons() { 
     Session session = this.sessionFactory.getCurrentSession(); 
     List<Person> personsList = session.createQuery("from Person").list(); 
     for(Person p : personsList){ 
      logger.info("Person List::"+p); 
     } 
     return personsList; 
    } 

    @Override 
    public Person getPersonById(int id) { 
     Session session = this.sessionFactory.getCurrentSession();  
     Person p = (Person) session.load(Person.class, new Integer(id)); 
     logger.info("Person loaded successfully, Person details="+p); 
     return p; 
    } 

    @Override 
    public void removePerson(int id) { 
     Session session = this.sessionFactory.getCurrentSession(); 
     Person p = (Person) session.load(Person.class, new Integer(id)); 
     if(null != p){ 
      session.delete(p); 
     } 
     logger.info("Person deleted successfully, person details="+p); 
    } 

} 

////////////////////////////////// Человек (модель) //////// ///////////////

package com.journaldev.spring.model; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.Table; 

/** 
* Entity bean with JPA annotations 
* Hibernate provides JPA implementation 
* @author pankaj 
* 
*/ 
@Entity 
@Table(name="PERSON") 
public class Person { 

    @Id 
    @Column(name="id") 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private int id; 

    private String name; 

    private String country; 

    public int getId() { 
     return id; 
    } 

    public void setId(int id) { 
     this.id = id; 
    } 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public String getCountry() { 
     return country; 
    } 

    public void setCountry(String country) { 
     this.country = country; 
    } 

    @Override 
    public String toString(){ 
     return "id="+id+", name="+name+", country="+country; 
    } 
} 

//////////////////////////// /////// PersonService ///////////////////

package com.journaldev.spring.service; 

import java.util.List; 

import com.journaldev.spring.model.Person; 

public interface PersonService { 

    public void addPerson(Person p); 
    public void updatePerson(Person p); 
    public List<Person> listPersons(); 
    public Person getPersonById(int id); 
    public void removePerson(int id); 

} 

//////////////// ////////////// ServiceImpl ////////////////////////////

package com.journaldev.spring.service; 

import java.util.List; 

import org.springframework.stereotype.Service; 
import org.springframework.transaction.annotation.Transactional; 

import com.journaldev.spring.dao.PersonDAO; 
import com.journaldev.spring.model.Person; 

@Service 
public class PersonServiceImpl implements PersonService { 

    private PersonDAO personDAO; 

    public void setPersonDAO(PersonDAO personDAO) { 
     this.personDAO = personDAO; 
    } 

    @Override 
    @Transactional 
    public void addPerson(Person p) { 
     this.personDAO.addPerson(p); 
    } 

    @Override 
    @Transactional 
    public void updatePerson(Person p) { 
     this.personDAO.updatePerson(p); 
    } 

    @Override 
    @Transactional 
    public List<Person> listPersons() { 
     return this.personDAO.listPersons(); 
    } 

    @Override 
    @Transactional 
    public Person getPersonById(int id) { 
     return this.personDAO.getPersonById(id); 
    } 

    @Override 
    @Transactional 
    public void removePerson(int id) { 
     this.personDAO.removePerson(id); 
    } 

} 
+1

Вы не «конвертируете» контроллер. Вы определяете свой API, затем создаете соответствующие контроллеры. За исключением некоторых вызовов службы эти контроллеры не будут иметь ничего общего с существующими. Поэтому на самом деле ничего не нужно преобразовывать. – zeroflagL

ответ

2

Его легко, что вам нужно сделать, это добавить ответ i n JSON для всех запросов, которые в этом нуждаются. Аннотации @ResponseBody, и вы можете вернуть любой объект, джексон будет сериализовать его в формате json для вас.

Например, в коде:

@RequestMapping("/remove/{id}") 
@ResponseBody 
public boolean removePerson(@PathVariable("id") int id){ 

    this.personService.removePerson(id); 
    //true if everything was OK, false if some exception 
    return true; 
} 

...

@RequestMapping(value = "/persons", method = RequestMethod.GET) 
@ResponseBody 
public List<Person> listPersons(Model model) { 
    return this.personService.listPersons(); 
} 

Вам нужно только изменить свой контроллер, чтобы сделать его успокоительных Также вам придется добавить логику к вашему JS код для обработки новых значений ответов.

+0

Почему 'return true' для OK? Если исключение не выбрано, запрос возвращает 200/OK в любом случае. – zeroflagL

+1

@zeroflagL да, я не хотел углубляться в детали, но он должен использовать правильные коды для действий отдыха, 200 = ОК, 201 = создано, ...но для упрощения ответа я не добавил его http://www.restapitutorial.com/httpstatuscodes.html – cralfaro

0

Просто используйте аннотацию @RestController.

Вы также можете обратиться к ранее задаваемый вопрос по этой ссылке

Difference between spring @Controller and @RestController annotation

+0

Только добавление '@ RestController' приведет к тому, что контроллер вернет имя просмотров. – zeroflagL

3

Сначала вы должны добавить Джексон DataBind зависимость в файле пом, то вы можете определить контроллер отдыха для Exemple:

@RestController 
    public class PersonRestService { 
     @Autowired 
    private PersonService personService ; 

     @RequestMapping(value="/persons",method=RequestMethod.POST) 
     public Person addPerson(@RequestBody Person Person) { 
      return personService.addPerson(Person); 
     } 
     @RequestMapping(value="/persons",method=RequestMethod.Delete) 
     public void deletePerson(int code) { 
      personService.deletePerson(code); 
     } 
     @RequestMapping(value="/persons",method=RequestMethod.GET) 
     public Person getPerson(@RequestParam int code) { 
      return personService.getPersonById(code); 
     } 
     @RequestMapping(value="/allPersons",method=RequestMethod.GET) 
     public List<Person> getAllPerson() { 
      return personService.getAllPerson(); 
     } 

    } 
+0

Ошибки в сторону, это не RESTful. Ваш контроллер предоставляет ресурс, который может быть как списком, так и одним человеком. Как это может быть? – zeroflagL

+0

Список лиц, которые я использую/allPersons, и для одного человека я использую/лиц? Code = id? где ошибки, которые я знаю, которые не входят в спецификации отдыха, но работают –

+0

Вы правы в отношении 'allPersons'. Но этого недостаточно. Для других запросов вам нужно использовать что-то вроде '/ persons/{code}'. Это делает каждого человека другим ресурсом. Это точка REST. Если вы используете параметры запроса, ресурс останется прежним. Но, очевидно, есть не один человек. – zeroflagL