2015-06-24 8 views
1

Я получаю ответ json от моего контроллера, хотя я добавил аннотации xml к моей модели. Я получаю список пользователей в json без проблем. Можно ли использовать @Entity и @XmlRootElement в одном классе?Spring Restcontroller не возвращает xml

User.java

@Entity 
@Table(name = "usr") 
@XmlRootElement 
public class User { 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "ID", nullable = false, unique = true, length = 11) 
    private int id; 

    @Column(nullable = false) 
    private String username; 

    @Column(nullable = false) 
    private String password; 

    @Column(nullable = false) 
    private String firstName; 

    @Column(nullable = false) 
    private String lastName; 

    @Column(nullable = false) 
    private String email; 

    @OneToMany(mappedBy = "user") 
    private List<Post> post; 

    @OneToMany(mappedBy = "user") 
    private List<Friend> friends; 

    public List<Friend> getFriends() { 
     return friends; 
    } 

    public void setFriends(List<Friend> friends) { 
     this.friends = friends; 
    } 

    public List<Post> getPost() { 
     return post; 
    } 

    public void setPost(List<Post> post) { 
     this.post = post; 
    } 

    public int getId() { 
     return id; 
    } 


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

    @XmlElement 
    public String getUsername() { 
     return username; 
    } 


    public void setUsername(String username) { 
     this.username = username; 
    } 

    public String getPassword() { 
     return password; 
    } 


    public void setPassword(String password) { 
     this.password = password; 
    } 

    @XmlElement 
    public String getFirstName() { 
     return firstName; 
    } 


    public void setFirstName(String firstName) { 
     this.firstName = firstName; 
    } 

    @XmlElement 
    public String getLastName() { 
     return lastName; 
    } 


    public void setLastName(String lastName) { 
     this.lastName = lastName; 
    } 

    @XmlElement 
    public String getEmail() { 
     return email; 
    } 

    public void setEmail(String email) { 
     this.email = email; 
    } 

} 

getAllUsers

@Override 
    public List<User> getAllUsers() { 
     List<User> users = new ArrayList<User>(); 
     Session session = HibernateUtil.getSessionAnnotationFactory().openSession(); 
     Transaction trns = null; 
     try { 
      trns = session.beginTransaction(); 
      users = session.createQuery("select firstName, lastName, email, username as name from User").list(); 
      trns.commit(); 
     } catch (RuntimeException e) { 
      if (trns != null) { 
       trns.rollback(); 
      } 
      e.printStackTrace(); 
     } finally { 
      session.flush(); 
      session.close(); 
     } 
     return users; 
    } 

и в контроллере

@RequestMapping(value="/api/users", method = RequestMethod.GET) 
public List<User> getAllUsers() { 

//List<User> users = new ArrayList<User>(); 
UserDao userdao = new UserDaoImpl(); 
List<User> users = userdao.getAllUsers(); 


return users; 

} 

Что я здесь отсутствует?

+0

Можете ли вы показать свой конфигурационный файл Spring? – Arpit

ответ

1

От Весны доходит blog entry. Оттуда это о содержании переговоров:

Включение Content Negotiation в Spring MVC

Spring поддерживает несколько конвенций для выбора формата требуется: URL суффиксов и/или параметр URL. Они работают вместе с использованием заголовков Accept. В результате тип контента может быть запрошен любым из трех способов: . По умолчанию они указаны в этом :

  • Добавить расширение пути (суффикс) в URL-адрес. Таким образом, если входящий URL-адрес равен , то что-то вроде http://myserver/myapp/accounts/list.html, тогда HTML - . Для электронной таблицы URL должен быть http://myserver/myapp/accounts/list.xls. Суффикс для формата медиа-типа автоматически определяется через активацию JavaBeans Framework или JAF (поэтому параметр activation.jar должен находиться в пути класса).
  • Параметр URL-адреса: http://myserver/myapp/accounts/list?format=xls. Имя параметра по умолчанию является форматом, но это может быть изменено. По умолчанию параметр отключен, но когда он включен, проверяется вторым.
  • Идентифицировано свойство HTTP-заголовка Accept: . Это то, как HTTP фактически определен для работы, но, как уже упоминалось ранее, это может быть проблематично.

Но если вы просто хотите, чтобы исправить тип возвращаемого я бы добавить аннотацию @RequestMapping(value="/api/users", produces={"application/xml"}) к вашему методу контроллера.

0

Во-первых, попробуйте изменить

@RequestMapping(value="/api/users", method = RequestMethod.GET) 

к

@ResponseBody 
@RequestMapping(value="/api/users", method = RequestMethod.GET, produces = MediaType.APPLICATION_XML_VALUE) 

Во-вторых, проверьте, если клиентский код (я предполагаю, что это JavaScript), посылает правильный Accept-типа, потому что Джексон - по умолчанию механизм сериализации будет выводить формат тела ответа из заголовка HTTP.

В-третьих, убедитесь, что у вас есть JAXB в вашем пути к классам.

+0

@ResponseBody, хотя у меня есть RestController в указанном классе? Ничего, все еще получая json, мне нужна зависимость JAXB? – franklinexpress

+0

Как вы думаете, что будет делать ваше первое предложение? –

Смежные вопросы