В моем проекте есть Spring REST и спящий режим. Я хочу отобразить ответ в формате xml, но независимо от идентификатора, который я передаю в URL-адресе, я получаю неправильный ответ xml, как показано ниже:
<COUNTRY id = "0">
<population>0</population>
</COUNTRY>
Я попал в следующий адрес:
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;
}
Может кто-нибудь, пожалуйста, помогите ...
Обновлено: замена нагрузки на решает проблему. Но теперь для / 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;
}
@ M.Deinum, это сработало с get () .. не могли бы вы сказать мне, почему это не сработало с load ()?
load создает прокси-сервер фактического объекта, фактически не обращаясь к базе данных, get фактически извлекает объект из базы данных. load будет работать, если текущая транзакция все еще активна, однако, поскольку вы находитесь за пределами метода обслуживания, это не так, и прокси-сервер не имеет возможности получить фактические данные из базы данных.
@ M.Deinum Да, даже у меня были сомнения по поводу использования load (). У меня другая ошибка с / getAllCountries. Не могли бы вы помочь мне с этим? Я обновил вопрос
Это совершенно другой вопрос, не задавайте 2 вопроса в одном вопросе.




Рекомендую добавить в @PathVariable имя параметра
Пример @PathVariable ("id")
Кроме того, если вы используете объект в качестве идентификатора, вы можете использовать целое число во всем слое вместо int.
Кроме того, целое число может быть нулевым, если это не требуется, поместите в переменную пути атрибут required = true. если null не допускается
Наконец, если вы не планируете работать с объектом и возвращать его напрямую, используйте session.get вместо session.load
Проблема в том, что ваш метод DAO использует Session.load вместо Session.get.
Разница между load и get заключается в том, что load (обычно всегда) возвращает ленивый прокси. Он будет получать фактические базовые данные только тогда, когда данные действительно запрашиваются (что также может привести к очень поздним EntityNotFoundException из-за отложенной проверки в базе данных). Обычно вы не замечаете ничего ленивого (возможно, в производительности), но в данном случае вы это заметите. вы находитесь за пределами активной транзакции (и, следовательно, Session), и из-за этого прокси-сервер больше не может получать необходимые данные из базы данных (и поскольку нет ничего, вы получите 0, поскольку это значение по умолчанию для int).
Не используйте
load. используйтеget. Также не используйтеnew Integer, просто используйтеidнапрямую (созданиеnew Integerдобавляет накладные расходы).