XML неверный ответ Spring REST и Hibernate - PullRequest
0 голосов
/ 03 июля 2018

В моем проекте Spring REST и Hibernate. Я хочу отобразить ответ в формате xml, но независимо от идентификатора, который я передаю в URL, я получаю неправильный ответ xml, как показано ниже:

<COUNTRY id="0">
<population>0</population>
</COUNTRY>

URL, который я нажал:

http://localhost:8080/SpringRestHibernateExample/getCountry/2

После отладки я обнаружил, что идентификатор корректно передается до уровня DAO, а также выбирается правильная страна. Как-то рендеринг не происходит правильно. Вот мои занятия

Контроллер

@RequestMapping(value = "/getCountry/{id}", method = RequestMethod.GET, 
headers = "Accept=application/xml",
        produces="application/xml")
public Country getCountryById(@PathVariable int id) {

    return countryService.getCountry(id);
}

Модель

@XmlRootElement (name = "COUNTRY")
@XmlAccessorType(XmlAccessType.FIELD)
@Entity
@Table(name="COUNTRY")
public class Country{

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

@XmlElement
@Column(name="countryName")
String countryName; 

@XmlElement
@Column(name="population")
long population;

public Country() {
    super();
}

Услуги

@Transactional
 public Country getCountry(int id) {
    System.out.println("service"+id);
    return countryDao.getCountry(id);
}

DAO

public Country getCountry(int id) {
    System.out.println("dao"+id);
    Session session = this.sessionFactory.getCurrentSession();
    Country country = (Country) session.load(Country.class, new Integer(id));

    return country;
}

Может кто-нибудь помочь, пожалуйста ...

РЕДАКТИРОВАТЬ: замена нагрузки на get решить проблему. Но теперь для / getAllCountries я получаю следующую ошибку:

The resource identified by this request is only capable of generating 
responses with characteristics not acceptable according to the request 
"accept" headers.

Ниже находится контроллер

 @RequestMapping(value = "/getAllCountries", method = 
 RequestMethod.GET,produces="application/xml",
        headers = "Accept=application/xml")
 public List<Country> getCountries() throws CustomerNotFoundException{

 List<Country> listOfCountries = countryService.getAllCountries();
 return listOfCountries;
}

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Проблема в том, что ваш метод DAO использует Session.load вместо Session.get.

Разница между load и get в том, что load (как правило, всегда) возвращает ленивый прокси. Он будет получать действительные базовые данные только тогда, когда данные действительно запрашиваются (что также может привести к очень поздним EntityNotFoundException с из-за отложенной проверки в базе данных). Обычно вы не замечаете ленивых вещей (возможно, в исполнении), но в этом случае вы замечаете. вы находитесь за пределами активной транзакции (и, следовательно, Session), и из-за этого прокси-сервер больше не может получать необходимые данные из базы данных (и поскольку там ничего нет, вы получите 0, так как это значение по умолчанию для int).

0 голосов
/ 03 июля 2018

Рекомендую добавить в @PathVariable имя параметра

Пример @PathVariable ("id")

Кроме того, если вы используете объект в качестве идентификатора, вы можете, как целое число, использовать его во всех слоях вместо int.

Кроме того, Integer может быть нулевым, если не требуется, поместите в PathVariable атрибут required = true. если ноль не разрешен

Наконец, если вы не планируете работать с объектом и возвращать его напрямую, используйте session.get вместо session.load

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...