Отдых Spring beans с помощью конфигурации xml

Я использую компоненты 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
}

Добавьте соответствующий код, чтобы понять проблему.

Alien 08.06.2018 13:39

Выбрасываем нулевой указатель, но где? Добавьте стек исключений, пожалуйста

Rafał Sokalski 08.06.2018 13:54

Извините моя ошибка. Вопрос обновлен. Проверьте, пожалуйста, @ RafałSokalski

user5330618 08.06.2018 13:58

Ну, я не вижу, где вы создаете bean allTopics

Rafał Sokalski 08.06.2018 14:05

Попробуйте создать список как bean-компонент, а затем добавить его как свойство. Пример: stackoverflow.com/a/2416113/6003541

Rafał Sokalski 08.06.2018 14:05

Нет такой же проблемы. @ RafałSokalski

user5330618 08.06.2018 14:09

Попробуйте проверить, содержит ли этот список элементы или это проблема с контроллером

Rafał Sokalski 08.06.2018 14:11

allTopics инициализируется компонентом. Я напечатал значения в его методе установки, но при вызове каким-либо другим способом он равен нулю. @ RafałSokalski

user5330618 08.06.2018 14:18

Итак, getAllTopics () возвращает null, а в аргументе setAllTopics () allTopics имеет значения, верно?

Rafał Sokalski 08.06.2018 14:23
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
9
254
2

Ответы 2

Предлагаю вам взглянуть на Джерси. Это REST-фреймворк, на мой взгляд, один из лучших. Обязательно используйте снимок последней версии Jersey (я считаю, что это версия 3), так как она будет полностью поддерживать Spring.

Его использование простое. Контроллер метода будет иметь вершину в 5 строк. Он также побуждает пользователей использовать лучшие практики RESTful API. Например, определение заголовка местоположения в успешной публикации, заголовки ссылок, ссылающиеся на разбиение по страницам в коллекции, среди прочего.

С Maven или Gradle в вашем проекте интеграция Jersey займет у вас 5 минут.

Я использую его поверх Spring, потому что его единственная цель - реализовать REST API, в то время как Spring имеет его просто как функцию.

Прошу прощения за отсутствие решения, просто спросите меня, нужна ли вам помощь для начала работы.

Андрес

Отдых работает нормально, когда я удаляю xml-конфигурацию beans. Думаю, проблема в сочетании того и другого. До сих пор не могу понять.

user5330618 10.06.2018 16:08

Это потому, что в основном методе у вас есть: TopicController tc= new TopicController();, что неверно. Spring должен создать экземпляр TopicController в вашем классе Main с помощью внедрения зависимостей. Над методом main следует написать @Autowired private TopicController tc; и удалите переменную "tc" в основном методе.

Другие вопросы по теме