Spring boot / MongoDB:期望GET和DELETE

时间:2016-04-28 22:22:24

标签: java spring mongodb spring-boot

我2天前开始学习春季启动,我已经阅读了很多文章,但不幸的是它没有按预期工作(我是Ruby on Rails开发者,我学习Java有点困难;) )

我想创建一个“简单”的REST应用程序,以便创建,获取和删除Tag类,并使用mongoDB。

我的理解是我必须使用以下内容创建TagRepository文件:

package com.petstore.repositories;

import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
import org.springframework.web.bind.annotation.RequestMapping;

import com.petstore.models.Tag;

@RepositoryRestResource(collectionResourceRel = "tags", path="tags")
public interface TagRepository extends MongoRepository<Tag, String> {

}

我希望能够管理以下网址:

GET: http://localhost:8080/tags
GET: http://localhost:8080/tag/:id
DELETE: http://localhost:8080/tag/:id

不幸的是我只能使用

GET: http://localhost:8080/tags
GET: http://localhost:8080/tags/:id
DELETE: http://localhost:8080/tags/:id

如果我尝试删除URL(/ tag /:id),我会收到此错误消息 不支持请求方法“DELETE”

但如果我使用删除网址(/ tags /:id),则可以正常使用。

你知道我做错了吗?

谢谢

3 个答案:

答案 0 :(得分:0)

您需要在mongoTemplate中自动装入Spring引导程序。关于这个主题有很多线程,你可以在SO上找到如何配置它,所以你需要在这里搜索答案:

@Autowired
private MongoTemplate mongoTemplate;

然后你需要创建你的方法并使用mongotemplate查询你的mongodb:

 @RequestMapping(value="/mymethod_fetch", method=RequestMethod.GET)
    public List myMethod(@RequestParam String name) {
        Query query = new Query();
        query.addCriteria(Criteria.where("name").is(name));
        query.with(new Sort(Sort.Direction.DESC, "_id"));
        query.limit(10);
        List<Object> obj = mongoTemplate.find(query, Object.class);
        return obj;
    }

这是删除的那个:

 @RequestMapping(value="/mymethod_item_delete", method=RequestMethod.DELETE)
    public void myMethod(@RequestParam String name) {
        Query query = new Query();
        query.addCriteria(Criteria.where("name").is(name));
        mongoTemplate.remove(query, Object.class);
    }

将浏览器指向api端点,通常为http://127.0.0.1:8080/mymethod_fetch,您将在浏览器中看到结果。

答案 1 :(得分:0)

谢谢,我会尽快尝试。

我发现了一种解决方法,但它非常难看。我覆盖了控制器中的方法。这里是PetController的一个例子:

  @Autowired
      private PetRepository petRepository;

      @RequestMapping(value = "/pet/{id}", method = RequestMethod.GET)
      @ResponseBody
      public Pet findOneRemapped(@PathVariable("id") String id) {
          return petRepository.findOne(id); 
      }

答案 2 :(得分:0)

我正在分享我的示例代码,该代码通过重命名为标记

我的主要课程

package com.example;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.data.web.config.EnableSpringDataWebSupport;

@SpringBootApplication
@EnableSpringDataWebSupport
public class SpringBootDemoApplication {

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

我的模特课

package com.example;

import org.springframework.data.annotation.Id;

public class Tag
{
    @Id
    String id;
    String tag;

    public String getId()
    {
        return id;
    }
    public void setId(String id)
    {
        this.id = id;
    }
    public String getTag()
    {
        return tag;
    }
    public void setTag(String tag)
    {
        this.tag = tag;
    }
}

最后是我们的存储库类

package com.example;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.mongodb.repository.MongoRepository;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;
import org.springframework.data.rest.core.annotation.RestResource;

@RepositoryRestResource(collectionResourceRel = "tags", path="tag")
public interface TagRepository extends MongoRepository<Tag, String>
{
    @RestResource(path = "tags")
    Page<Tag> findAll(Pageable pageable);

    void delete(String tag);
}

使用上面的示例代码,您可以启动春季启动代码,当您点击http://localhost:8080/tag时,您可以看到所有代码,类似地,您可以通过点击网址http://localhost:8080/tag/:id并按http://localhost:8080/tag/:id删除来检索单个代码

下面是我用来演示上述代码的pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.example</groupId>
    <artifactId>MongoDB</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <packaging>war</packaging>

    <name>SpringBootDemo</name>
    <description>Demo project for Spring Boot</description>

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.3.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-rest</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.data</groupId>
            <artifactId>spring-data-rest-hal-browser</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>


</project>

使用此代码,我们可以获得您想要的网址路径