简体   繁体   中英

Rest Spring beans using xml Configuration

I am using Rest Spring beans using xml Configuration. I am trying to access variables which are initailized by beans using REST urls. But i am not able to fetch values. values fetched are null. Is there anyway to initalize values and keep them intact and access them when i make call using urls.

Please suggest some way.

TIA

Edit: Model:

@Repository
public class Topic{

    private Integer id;
    private String name;
    //Getter and setter with constructor
}

Controller Class:

@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>

output of /localhost:8080/topics is: {"id":null,"name":null}

Main class:

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
}

I suggest you take a look at Jersey. It's a REST framework, one of the best in my opinion. Be sure to use a Snapshot of the last version of Jersey (I believe it's version 3), as it will have full support of Spring.

It's usage is simple. A method controller will have 5 lines tops. It also encourages users to the best practices of a RESTful API. Such as defining the location header on a successful post, link headers referencing paging in a collection get, amongst others.

With Maven or Gradle in your project, integrating Jersey will take you 5 minutes.

I use it over Spring because it's sole purpose is implementing a REST API, while Spring has it simply as a feature.

I apologize for my lack of solution, just ask me if you need help getting started.

Andrés

That's because in the main method you have: TopicController tc= new TopicController(); which is wrong. The TopicController should be instantiated by Spring in your Main class using dependency injection. Above the main method you should write @Autowired private TopicController tc; , and remove the "tc" variable in the main method.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM