创建自定义REST控制器时覆盖默认的dispatcherServlet

时间:2015-08-10 10:11:25

标签: spring mongodb spring-mvc spring-boot spring-data-mongodb

my question here之后,我成功创建了一个自定义REST控制器来处理对 / api / urls 的不同类型的请求并进行相应的操作。

但是,仍有一个默认控制器处理 / urls 的请求会影响我的应用程序:当收到不是 / api / something 的请求时,它应该获取我的数据库是链接到 / whatever 的URL,并将用户重定向到那里。此外,在 / api / urls 下,我已经开发了一些验证规则,以确保请求的完整性和优化,而不会在/ url中进行任何操作,因此任何人都可以将任何类型的数据插入到我的数据库中。 / p>

禁用此默认处理程序的可能方法是什么?看到日志,我按照指示here注册我自己的ServletRegistrationBean,但据我所知,这是为了拥有两个独立的环境

我的目标是简单地“断开”/ url URL与默认的REST控制器 - 现在我已经拥有自己的一个对我不再有用了 - 只需使用我在中实现的自定义控件/ api / urls (或者我可能决定使用的其他任何URL,例如“/ service / shortener * if if)”

以下是我的Java类:

Url.java(为简洁省略了getter和setter):

@Document
public class Url {
    @Id private String id;
    private String longURL;
    private String hash;
    private String originalUrl;
    private String shortUri;
    private Date creationDate;
}

UrlRepository.java

import org.springframework.data.mongodb.repository.MongoRepository;

public interface UrlRepository extends MongoRepository<Url, String> {
    // Empty
}

UrlController.java:

import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/api/urls")
public class UrlController { 

    @Autowired
    private UrlRepository repo;

    @RequestMapping(method=RequestMethod.GET)
    public List<Url> getAll() {
        System.out.println("Showing all stored links");
        List<Url> results = repo.findAll();
        return results;
    }

    @RequestMapping(method=RequestMethod.GET, value="{id}")
    public Url getUrl(@PathVariable String id) {
        System.out.println("Looking for URL " + id);
        return null;
    }

    @RequestMapping(method=RequestMethod.POST)
    public Url create(@RequestBody Url url) {
        System.out.println("Received POST " + url);
        return null;
    }

    @RequestMapping(method=RequestMethod.DELETE, value="{id}")
    public void delete(@PathVariable String id) {
        //TBD
    }

    @RequestMapping(method=RequestMethod.PUT, value="{id}")
    public Url update(@PathVariable String id, @RequestBody Url url) {
        //TBD
    }

}    

Application.java:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;


@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

1 个答案:

答案 0 :(得分:0)

我没有试图破解Spring Boot和Spring Data REST的方式,而是强烈建议使用框架而不是它们。

要将默认的上下文路径从/更改为/api,只需在application.properties文件中添加一个属性即可。

server.context-path=/api

现在您需要将控制器映射更改为/urls而不是/api/urls

如果您只想要/api用于Spring Data REST端点,请使用以下属性

spring.data.rest.base-uri=/api

这将使/api下的所有Spring Data REST端点都可用。您希望覆盖/urls,而不是使用@Controller使用@RepositoryRestController,这将使您的控制器覆盖默认情况下注册的控制器。

@RepositoryRestController
@RequestMapping("/urls")
public class UrlController { ... }