在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);
}
}
答案 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 { ... }