Я использую компоненты Rest Spring, используя конфигурацию xml. Я пытаюсь получить доступ к переменным, которые инициализируются bean-компонентами с использованием URL-адресов REST. Но я не могу получить значения. полученные значения равны нулю. Есть ли способ инициализировать значения и сохранить их нетронутыми и получить к ним доступ, когда я звоню с использованием URL-адресов.
Пожалуйста, предложите какой-нибудь способ.
TIA
Редактировать: Модель:
@Repository
public class Topic{
private Integer id;
private String name;
//Getter and setter with constructor
}
Класс контроллера:
@RestController
@Singleton
public class TopicController{
@Autowired
private TopicService topicService;
public void setTopicService(TopicService topicService) {
this.topicService = topicService;
}
@RequestMapping("/topics")
public List<Topic> getAllTopics() {
System.out.println("in get all topics");
return topicService.getAllTopics();
}
}
ServiceClass:
@Service
public class TopicService {
@Autowired
private List<Topic> allTopics ;
public TopicService() {
}
public List<Topic> getAllTopics() {
return allTopics;
}
public void setAllTopics(List<Topic> allTopics) {
this.allTopics = allTopics;
}
}
Bean.xml
<bean name = "topicService" id = "topicService"
class = "org.springtest.service.TopicService">
<property name = "allTopics">
<list>
<bean class = "org.springtest.model.Topic">
<property name = "id" value = "20" />
<property name = "name" value = "topic20" />
</bean>
<bean class = "org.springtest.model.Topic">
<property name = "id" value = "30" />
<property name = "name" value = "Topic30" />
</bean>
</list>
</property>
</bean>
<bean id = "topicController"
class = "org.springtest.controller.TopicController"
scope = "singleton">
<property name = "topicService" ref = "topicService"></property>
</bean>
выход
/localhost:8080/topics - это:
{"id":null,"name":null}
Основной класс:
public static void main(String[] args) {
SpringApplication.run(CourseApiApp.class, args);
ApplicationContext context = new
ClassPathXmlApplicationContext("main/resources/Bean.xml");
TopicController tc= new TopicController();
System.out.println(tc.getAllTopics().size());// throwing nullpointerexception as topicService is null
}
Выбрасываем нулевой указатель, но где? Добавьте стек исключений, пожалуйста
Извините моя ошибка. Вопрос обновлен. Проверьте, пожалуйста, @ RafałSokalski
Ну, я не вижу, где вы создаете bean allTopics
Попробуйте создать список как bean-компонент, а затем добавить его как свойство. Пример: stackoverflow.com/a/2416113/6003541
Нет такой же проблемы. @ RafałSokalski
Попробуйте проверить, содержит ли этот список элементы или это проблема с контроллером
allTopics инициализируется компонентом. Я напечатал значения в его методе установки, но при вызове каким-либо другим способом он равен нулю. @ RafałSokalski
Итак, getAllTopics () возвращает null, а в аргументе setAllTopics () allTopics имеет значения, верно?




Предлагаю вам взглянуть на Джерси. Это REST-фреймворк, на мой взгляд, один из лучших. Обязательно используйте снимок последней версии Jersey (я считаю, что это версия 3), так как она будет полностью поддерживать Spring.
Его использование простое. Контроллер метода будет иметь вершину в 5 строк. Он также побуждает пользователей использовать лучшие практики RESTful API. Например, определение заголовка местоположения в успешной публикации, заголовки ссылок, ссылающиеся на разбиение по страницам в коллекции, среди прочего.
С Maven или Gradle в вашем проекте интеграция Jersey займет у вас 5 минут.
Я использую его поверх Spring, потому что его единственная цель - реализовать REST API, в то время как Spring имеет его просто как функцию.
Прошу прощения за отсутствие решения, просто спросите меня, нужна ли вам помощь для начала работы.
Андрес
Отдых работает нормально, когда я удаляю xml-конфигурацию beans. Думаю, проблема в сочетании того и другого. До сих пор не могу понять.
Это потому, что в основном методе у вас есть: TopicController tc= new TopicController();, что неверно. Spring должен создать экземпляр TopicController в вашем классе Main с помощью внедрения зависимостей. Над методом main следует написать
@Autowired
private TopicController tc; и удалите переменную "tc" в основном методе.
Добавьте соответствующий код, чтобы понять проблему.