• Spring Boot-JPA


    前文我们使用SPRING INITIALIZR快速构建了一个空的Spring Boot项目,并增加web模块实现了HTTP请求。

    这一篇继续在该demo的基础上,增加JPA的功能。

    JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象关系表的映射关系,并将运行时的实体对象持久化到数据库中。

    引入JPA模块

    1.在POM文件中添加:

    <!-- JPA模块 -->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-jpa</artifactId>
            </dependency>
    <!-- mysql -->

    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <scope>runtime</scope>
    </dependency>

     

    2.在application.properties属性文件中定义好数据源(传统做法,这里不演示了)

    2.(我们使用Spring推荐的yml来配置)新建application.yml文件,内容如下:

    server:
      port: 8000
    spring:
      application:
        name: demo
      jpa:
        properties:
          hibernate: 
            cache: 
              use_second_level_cache: false
              use_query_cache: false
            generate_statistics: true
            cache.region.factory_class: org.hibernate.cache.ehcache.EhCacheRegionFactory
        generate-ddl: false
        hibernate:
          ddl-auto: update
        show-sql: true
      datasource:
        platform: mysql
        url: jdbc:mysql://127.0.0.1:3306/demo?useUnicode=true&characterEncoding=utf8
        username: root
        password: 你的数据库密码
    #    schema: classpath:schema.sql
    #    data: classpath:data.sql
    logging:
      level:
        root: info    

    相应的,在本地创建一个叫demo的数据库,用于我们的测试。

    定义2个实体

    1.新建包com.v5ent.demo.domain

    2.在这个包下新建两个实体类Tag和Note,代码如下

    /*
     * Copyright 2012-2017 the original author or authors.
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *      http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */
    
    package com.v5ent.demo.domain;
    
    import java.util.List;
    
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.ManyToMany;
    import javax.persistence.SequenceGenerator;
    
    @Entity
    public class Note {
    
        @Id
        @SequenceGenerator(name="note_generator", sequenceName="note_sequence", initialValue = 5)
        @GeneratedValue(generator = "note_generator")
        private long id;
    
        private String title;
    
        private String body;
    
        @ManyToMany
        private List<Tag> tags;
    
        protected Note() {};
        
        public Note(String title, String body) {
            this.title = title;
            this.body = body;
        }
    
        public long getId() {
            return this.id;
        }
    
        public void setId(long id) {
            this.id = id;
        }
    
        public String getTitle() {
            return this.title;
        }
    
        public void setTitle(String title) {
            this.title = title;
        }
    
        public String getBody() {
            return this.body;
        }
    
        public void setBody(String body) {
            this.body = body;
        }
    
        public List<Tag> getTags() {
            return this.tags;
        }
    
        public void setTags(List<Tag> tags) {
            this.tags = tags;
        }
    
    }

    Tag:

    /*
     * Copyright 2012-2017 the original author or authors.
     *
     * Licensed under the Apache License, Version 2.0 (the "License");
     * you may not use this file except in compliance with the License.
     * You may obtain a copy of the License at
     *
     *      http://www.apache.org/licenses/LICENSE-2.0
     *
     * Unless required by applicable law or agreed to in writing, software
     * distributed under the License is distributed on an "AS IS" BASIS,
     * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     * See the License for the specific language governing permissions and
     * limitations under the License.
     */
    
    package com.v5ent.demo.domain;
    
    import java.util.List;
    
    import javax.persistence.Entity;
    import javax.persistence.GeneratedValue;
    import javax.persistence.Id;
    import javax.persistence.ManyToMany;
    import javax.persistence.SequenceGenerator;
    
    @Entity
    public class Tag {
    
        @Id
        @SequenceGenerator(name="tag_generator", sequenceName="tag_sequence", initialValue = 4)
        @GeneratedValue(generator = "tag_generator")
        private long id;
    
        private String name;
    
        @ManyToMany(mappedBy = "tags")
        private List<Note> notes;
    
        public long getId() {
            return this.id;
        }
    
        public void setId(long id) {
            this.id = id;
        }
    
        public String getName() {
            return this.name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public List<Note> getNotes() {
            return this.notes;
        }
    
        public void setNotes(List<Note> notes) {
            this.notes = notes;
        }
    
    }

    这里我们定义了两个多对多的实体,笔记和标签。

    定义2个实体的Jpa

    1.新建包com.v5ent.demo.repository

    2.在这个包下新建两个Jpa类TagRepository和NoteRepository,代码如下

    package com.v5ent.demo.repository;
    
    import org.springframework.data.jpa.repository.JpaRepository;
    
    import com.v5ent.demo.domain.Tag;
    
    /**
     * Spring Data JPA repository for the Tag entity.
     */
    public interface TagRepository extends JpaRepository<Tag,Long> {
    
    }
    package com.v5ent.demo.repository;
    
    import java.util.List;
    
    import org.springframework.data.jpa.repository.JpaRepository;
    
    import com.v5ent.demo.domain.Note;
    
    /**
     * Spring Data JPA repository for the Note entity.
     */
    public interface NoteRepository extends JpaRepository<Note,Long> {
    
    }

    至此,所有的工作就完成了。

    大家可以看一下仓库类的父类,常用的数据库访问操作都默认实现了。

    JPA的查询方法

    在JPA中有三种方式可以进行数据的查询(1,方法命名查询 2,@NamedQuery查询 3,@Query查询),

    第一种:方法命名查询

    1. Spring Data JPA支持通过定义在Repository接口的方法来定义查询,方法名字是根据实体类的属性名来确定的,示例如下:

    /**
     * Spring Data JPA repository for the Note entity.
     */
    public interface NoteRepository extends JpaRepository<Note,Long> {
    
        List<Note> findByBody(String body);
       List<Note> findByTitleAndBody(String title,String body);
    }

    从代码可以看出,使用findBy这样的关键字,就可以直接实现根据字段查询。(这里的findBy也可以用find,getBy,query,read代替)而And就相当于sql语句中的and。

    2.用关键字限制结果数量,用top和first来实现,示例:
    /*
    *查询符合条件的前十条记录
    */
    List<Note> findFirst10ByTitle(String title)
    /*
    *查询符合条件的前30条记录
    */
    List<Note> findTop30ByTitle(String title);

    第二种:@NamedQuery查询

     Spring Data JPA 支持@NameQuery来定义查询方法,即一个名称映射一个查询语句(要在实体类上写,不是接口里写),示例如下:

    @Entity
    @NamedQuery(name="Note.findByTitle",
    query="select p from Note p where p.title=?1")
    public class Note{
    
    }

    如果要将多个方法都进行重新定义,可以使用@NameQueries标签,示例如下:

    @Entity
    @NamedQueries({
    @NamedQuery(name="Note.findByTitle",
    query="select p from Note p where p.title=?1"),
    @NamedQuery(name = "Note.withTitleAndBodyQuery",
    query = "select p from Note p where p.title=?1 and body=?2")
    })
    public class Note{
    
    }

    这个时候,接口里定义的findByName方法就是上面的方法了,不再是方法命名查询的方法了。

    第三种:@Query查询

     Spring Data JPA 支持@Query来定义查询方法,使用方法是将@Query写在接口的方法上面,示例如下:

    public interface NoteRepository extends JpaRepository<Note, Long> {
         @Query("select p from Note p where p.title like ?1 ")
        List<Note> anyQuery(String title);
       
    }

    这里的参数是根据索引号来进行查询的。

    当然我们也是可以根据名称来进行匹配,然后进行查询的,示例如下:

    public interface NoteRepository extends JpaRepository<Note, Long> {
         @Query("select p from Note p where p.title like :title")
        List<Note> anyQuery(@Param("title")String title); }

    如果是模糊匹配呢,这么写:

    @Query("select p from Note p where p.title like %:title%")
        List<Note> anyQuery(@Param("title")String title); 

    我们再来看看更新是如何写的。

    Spring Data JPA支持使用@Modifying和@Query注解组合来进行更新查询,示例如下:

    @Modifying
    @Transcational
    @Query("update Note p set p.title=?1 ")
    int setTitle(String title);

    int表示的是更新语句所影响的行数。

    来测试看看

    1.我们不准使用之前的测试类,我准备直接在启动的时候测试。首先在DemoApplication中增加如下测试代码:

      @Bean
        public CommandLineRunner demo(final NoteRepository repository) {
            return new CommandLineRunner() {
                
                @Override
                public void run(String... args) throws Exception {
                    // save a couple of Notes
                    repository.save(new Note("Have a nice Day", "Don’t let mental blocks control you. Set yourself free. Confront your fear and turn the mental blocks into building blocks."));
                    repository.save(new Note("x-Notes", "Chloe O'Brian,Kim Bauer"));
                    repository.save(new Note("Some Others", "No news is good news"));
    
                    // fetch all Notes
                    log.info("Notes found with findAll():");
                    log.info("-------------------------------");
                    for (Note note : repository.findAll()) {
                        log.info(note.toString());
                    }
    
                    // fetch an individual note by ID
                    Note note = repository.findOne(1L);
                    log.info("Note found with findOne(1L):");
                    log.info("--------------------------------");
                    log.info(note.toString());
    
                    // fetch Notes by last name
                    log.info("Note found with anyQuery("Some"):");
                    log.info("--------------------------------------------");
                    for (Note bauer : repository.anyQuery("Some")) {
                        log.info(bauer.toString());
                    }
                }
            };
        }

    2.执行main方法跑起来,我们可以看到控制台输出了我们的操作日志。

    2017-05-18 11:48:07.820  INFO 12460 --- [           main] com.v5ent.demo.DemoApplication           : Note found with findOne(1L):
    2017-05-18 11:48:07.820  INFO 12460 --- [           main] com.v5ent.demo.DemoApplication           : --------------------------------
    2017-05-18 11:48:07.820  INFO 12460 --- [           main] com.v5ent.demo.DemoApplication           : com.v5ent.demo.domain.Note@7893c715
    2017-05-18 11:48:07.820  INFO 12460 --- [           main] com.v5ent.demo.DemoApplication           : Note found with anyQuery("Some"):
    2017-05-18 11:48:07.820  INFO 12460 --- [           main] com.v5ent.demo.DemoApplication           : --------------------------------------------

    补充

    不得不提,在此基础上,实现Rest化API很简单。下面来展开实验:

    在当前的情况下,我们看一下mvc方面的日志:

    2017-05-18 12:13:45.980  INFO 12664 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/hello]}" onto public java.lang.String com.v5ent.demo.web.HelloController.index()
    2017-05-18 12:13:45.985  INFO 12664 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
    2017-05-18 12:13:45.985  INFO 12664 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
    2017-05-18 12:13:46.024  INFO 12664 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
    2017-05-18 12:13:46.024  INFO 12664 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
    2017-05-18 12:13:46.078  INFO 12664 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
    2017-05-18 12:13:46.354  INFO 12664 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
    2017-05-18 12:13:46.421  INFO 12664 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8000 (http)

    可以看到/hello这个我们之前实现的controller,如果我们要实现note和tag的对外api,当然也要自己写controller。但是Sring就是专门把这些固定的做法实现的机构,所以Spring已经封装了rest风格api所需要的controller实现。

    简单来讲,我们只需要在pom文件中增加:

         <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-rest</artifactId>
            </dependency>

    ok,现在启动看看日志:

    2017-05-18 12:55:36.876  INFO 7124 --- [           main] s.w.s.m.m.a.RequestMappingHandlerAdapter : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@72a7c7e0: startup date [Thu May 18 12:55:30 CST 2017]; root of context hierarchy
    2017-05-18 12:55:36.954  INFO 7124 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/hello]}" onto public java.lang.String com.v5ent.demo.web.HelloController.index()
    2017-05-18 12:55:36.958  INFO 7124 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error]}" onto public org.springframework.http.ResponseEntity<java.util.Map<java.lang.String, java.lang.Object>> org.springframework.boot.autoconfigure.web.BasicErrorController.error(javax.servlet.http.HttpServletRequest)
    2017-05-18 12:55:36.959  INFO 7124 --- [           main] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped "{[/error],produces=[text/html]}" onto public org.springframework.web.servlet.ModelAndView org.springframework.boot.autoconfigure.web.BasicErrorController.errorHtml(javax.servlet.http.HttpServletRequest,javax.servlet.http.HttpServletResponse)
    2017-05-18 12:55:36.994  INFO 7124 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/webjars/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
    2017-05-18 12:55:36.995  INFO 7124 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
    2017-05-18 12:55:37.010  INFO 7124 --- [           main] .m.m.a.ExceptionHandlerExceptionResolver : Detected @ExceptionHandler methods in repositoryRestExceptionHandler
    2017-05-18 12:55:37.102  INFO 7124 --- [           main] o.s.w.s.handler.SimpleUrlHandlerMapping  : Mapped URL path [/**/favicon.ico] onto handler of type [class org.springframework.web.servlet.resource.ResourceHttpRequestHandler]
    2017-05-18 12:55:37.262  INFO 7124 --- [           main] o.s.d.r.w.RepositoryRestHandlerAdapter   : Looking for @ControllerAdvice: org.springframework.boot.context.embedded.AnnotationConfigEmbeddedWebApplicationContext@72a7c7e0: startup date [Thu May 18 12:55:30 CST 2017]; root of context hierarchy
    2017-05-18 12:55:37.275  INFO 7124 --- [           main] o.s.d.r.w.RepositoryRestHandlerMapping   : Mapped "{[/ || ],methods=[OPTIONS],produces=[application/hal+json || application/json]}" onto public org.springframework.http.HttpEntity<?> org.springframework.data.rest.webmvc.RepositoryController.optionsForRepositories()
    2017-05-18 12:55:37.276  INFO 7124 --- [           main] o.s.d.r.w.RepositoryRestHandlerMapping   : Mapped "{[/ || ],methods=[HEAD],produces=[application/hal+json || application/json]}" onto public org.springframework.http.ResponseEntity<?> org.springframework.data.rest.webmvc.RepositoryController.headForRepositories()
    2017-05-18 12:55:37.277  INFO 7124 --- [           main] o.s.d.r.w.RepositoryRestHandlerMapping   : Mapped "{[/ || ],methods=[GET],produces=[application/hal+json || application/json]}" onto public org.springframework.http.HttpEntity<org.springframework.data.rest.webmvc.RepositoryLinksResource> org.springframework.data.rest.webmvc.RepositoryController.listRepositories()
    2017-05-18 12:55:37.280  INFO 7124 --- [           main] o.s.d.r.w.RepositoryRestHandlerMapping   : Mapped "{[/{repository}/{id}],methods=[DELETE],produces=[application/hal+json || application/json]}" onto public org.springframework.http.ResponseEntity<?> org.springframework.data.rest.webmvc.RepositoryEntityController.deleteItemResource(org.springframework.data.rest.webmvc.RootResourceInformation,java.io.Serializable,org.springframework.data.rest.webmvc.support.ETag) throws org.springframework.data.rest.webmvc.ResourceNotFoundException,org.springframework.web.HttpRequestMethodNotSupportedException
    2017-05-18 12:55:37.280  INFO 7124 --- [           main] o.s.d.r.w.RepositoryRestHandlerMapping   : Mapped "{[/{repository}/{id}],methods=[PATCH],produces=[application/hal+json || application/json]}" onto public org.springframework.http.ResponseEntity<org.springframework.hateoas.ResourceSupport> org.springframework.data.rest.webmvc.RepositoryEntityController.patchItemResource(org.springframework.data.rest.webmvc.RootResourceInformation,org.springframework.data.rest.webmvc.PersistentEntityResource,java.io.Serializable,org.springframework.data.rest.webmvc.PersistentEntityResourceAssembler,org.springframework.data.rest.webmvc.support.ETag,java.lang.String) throws org.springframework.web.HttpRequestMethodNotSupportedException,org.springframework.data.rest.webmvc.ResourceNotFoundException
    2017-05-18 12:55:37.280  INFO 7124 --- [           main] o.s.d.r.w.RepositoryRestHandlerMapping   : Mapped "{[/{repository}],methods=[OPTIONS],produces=[application/hal+json || application/json]}" onto public org.springframework.http.ResponseEntity<?> org.springframework.data.rest.webmvc.RepositoryEntityController.optionsForCollectionResource(org.springframework.data.rest.webmvc.RootResourceInformation)
    2017-05-18 12:55:37.281  INFO 7124 --- [           main] o.s.d.r.w.RepositoryRestHandlerMapping   : Mapped "{[/{repository}],methods=[HEAD],produces=[application/hal+json || application/json]}" onto public org.springframework.http.ResponseEntity<?> org.springframework.data.rest.webmvc.RepositoryEntityController.headCollectionResource(org.springframework.data.rest.webmvc.RootResourceInformation,org.springframework.data.rest.webmvc.support.DefaultedPageable) throws org.springframework.web.HttpRequestMethodNotSupportedException
    2017-05-18 12:55:37.281  INFO 7124 --- [           main] o.s.d.r.w.RepositoryRestHandlerMapping   : Mapped "{[/{repository}],methods=[GET],produces=[application/hal+json || application/json]}" onto public org.springframework.hateoas.Resources<?> org.springframework.data.rest.webmvc.RepositoryEntityController.getCollectionResource(org.springframework.data.rest.webmvc.RootResourceInformation,org.springframework.data.rest.webmvc.support.DefaultedPageable,org.springframework.data.domain.Sort,org.springframework.data.rest.webmvc.PersistentEntityResourceAssembler) throws org.springframework.data.rest.webmvc.ResourceNotFoundException,org.springframework.web.HttpRequestMethodNotSupportedException
    2017-05-18 12:55:37.281  INFO 7124 --- [           main] o.s.d.r.w.RepositoryRestHandlerMapping   : Mapped "{[/{repository}],methods=[GET],produces=[application/x-spring-data-compact+json || text/uri-list]}" onto public org.springframework.hateoas.Resources<?> org.springframework.data.rest.webmvc.RepositoryEntityController.getCollectionResourceCompact(org.springframework.data.rest.webmvc.RootResourceInformation,org.springframework.data.rest.webmvc.support.DefaultedPageable,org.springframework.data.domain.Sort,org.springframework.data.rest.webmvc.PersistentEntityResourceAssembler) throws org.springframework.data.rest.webmvc.ResourceNotFoundException,org.springframework.web.HttpRequestMethodNotSupportedException
    2017-05-18 12:55:37.281  INFO 7124 --- [           main] o.s.d.r.w.RepositoryRestHandlerMapping   : Mapped "{[/{repository}],methods=[POST],produces=[application/hal+json || application/json]}" onto public org.springframework.http.ResponseEntity<org.springframework.hateoas.ResourceSupport> org.springframework.data.rest.webmvc.RepositoryEntityController.postCollectionResource(org.springframework.data.rest.webmvc.RootResourceInformation,org.springframework.data.rest.webmvc.PersistentEntityResource,org.springframework.data.rest.webmvc.PersistentEntityResourceAssembler,java.lang.String) throws org.springframework.web.HttpRequestMethodNotSupportedException
    2017-05-18 12:55:37.282  INFO 7124 --- [           main] o.s.d.r.w.RepositoryRestHandlerMapping   : Mapped "{[/{repository}/{id}],methods=[OPTIONS],produces=[application/hal+json || application/json]}" onto public org.springframework.http.ResponseEntity<?> org.springframework.data.rest.webmvc.RepositoryEntityController.optionsForItemResource(org.springframework.data.rest.webmvc.RootResourceInformation)
    2017-05-18 12:55:37.282  INFO 7124 --- [           main] o.s.d.r.w.RepositoryRestHandlerMapping   : Mapped "{[/{repository}/{id}],methods=[HEAD],produces=[application/hal+json || application/json]}" onto public org.springframework.http.ResponseEntity<?> org.springframework.data.rest.webmvc.RepositoryEntityController.headForItemResource(org.springframework.data.rest.webmvc.RootResourceInformation,java.io.Serializable,org.springframework.data.rest.webmvc.PersistentEntityResourceAssembler) throws org.springframework.web.HttpRequestMethodNotSupportedException
    2017-05-18 12:55:37.282  INFO 7124 --- [           main] o.s.d.r.w.RepositoryRestHandlerMapping   : Mapped "{[/{repository}/{id}],methods=[GET],produces=[application/hal+json || application/json]}" onto public org.springframework.http.ResponseEntity<org.springframework.hateoas.Resource<?>> org.springframework.data.rest.webmvc.RepositoryEntityController.getItemResource(org.springframework.data.rest.webmvc.RootResourceInformation,java.io.Serializable,org.springframework.data.rest.webmvc.PersistentEntityResourceAssembler,org.springframework.http.HttpHeaders) throws org.springframework.web.HttpRequestMethodNotSupportedException
    2017-05-18 12:55:37.283  INFO 7124 --- [           main] o.s.d.r.w.RepositoryRestHandlerMapping   : Mapped "{[/{repository}/{id}],methods=[PUT],produces=[application/hal+json || application/json]}" onto public org.springframework.http.ResponseEntity<? extends org.springframework.hateoas.ResourceSupport> org.springframework.data.rest.webmvc.RepositoryEntityController.putItemResource(org.springframework.data.rest.webmvc.RootResourceInformation,org.springframework.data.rest.webmvc.PersistentEntityResource,java.io.Serializable,org.springframework.data.rest.webmvc.PersistentEntityResourceAssembler,org.springframework.data.rest.webmvc.support.ETag,java.lang.String) throws org.springframework.web.HttpRequestMethodNotSupportedException
    2017-05-18 12:55:37.285  INFO 7124 --- [           main] o.s.d.r.w.RepositoryRestHandlerMapping   : Mapped "{[/{repository}/{id}/{property}],methods=[DELETE],produces=[application/hal+json || application/json]}" onto public org.springframework.http.ResponseEntity<? extends org.springframework.hateoas.ResourceSupport> org.springframework.data.rest.webmvc.RepositoryPropertyReferenceController.deletePropertyReference(org.springframework.data.rest.webmvc.RootResourceInformation,java.io.Serializable,java.lang.String) throws java.lang.Exception
    2017-05-18 12:55:37.286  INFO 7124 --- [           main] o.s.d.r.w.RepositoryRestHandlerMapping   : Mapped "{[/{repository}/{id}/{property}],methods=[GET],produces=[application/x-spring-data-compact+json || text/uri-list]}" onto public org.springframework.http.ResponseEntity<org.springframework.hateoas.ResourceSupport> org.springframework.data.rest.webmvc.RepositoryPropertyReferenceController.followPropertyReferenceCompact(org.springframework.data.rest.webmvc.RootResourceInformation,java.io.Serializable,java.lang.String,org.springframework.data.rest.webmvc.PersistentEntityResourceAssembler) throws java.lang.Exception
    2017-05-18 12:55:37.286  INFO 7124 --- [           main] o.s.d.r.w.RepositoryRestHandlerMapping   : Mapped "{[/{repository}/{id}/{property}],methods=[GET],produces=[application/hal+json || application/json]}" onto public org.springframework.http.ResponseEntity<org.springframework.hateoas.ResourceSupport> org.springframework.data.rest.webmvc.RepositoryPropertyReferenceController.followPropertyReference(org.springframework.data.rest.webmvc.RootResourceInformation,java.io.Serializable,java.lang.String,org.springframework.data.rest.webmvc.PersistentEntityResourceAssembler) throws java.lang.Exception
    2017-05-18 12:55:37.286  INFO 7124 --- [           main] o.s.d.r.w.RepositoryRestHandlerMapping   : Mapped "{[/{repository}/{id}/{property}/{propertyId}],methods=[GET],produces=[application/hal+json || application/json]}" onto public org.springframework.http.ResponseEntity<org.springframework.hateoas.ResourceSupport> org.springframework.data.rest.webmvc.RepositoryPropertyReferenceController.followPropertyReference(org.springframework.data.rest.webmvc.RootResourceInformation,java.io.Serializable,java.lang.String,java.lang.String,org.springframework.data.rest.webmvc.PersistentEntityResourceAssembler) throws java.lang.Exception
    2017-05-18 12:55:37.286  INFO 7124 --- [           main] o.s.d.r.w.RepositoryRestHandlerMapping   : Mapped "{[/{repository}/{id}/{property}/{propertyId}],methods=[DELETE],produces=[application/hal+json || application/json]}" onto public org.springframework.http.ResponseEntity<org.springframework.hateoas.ResourceSupport> org.springframework.data.rest.webmvc.RepositoryPropertyReferenceController.deletePropertyReferenceId(org.springframework.data.rest.webmvc.RootResourceInformation,java.io.Serializable,java.lang.String,java.lang.String) throws java.lang.Exception
    2017-05-18 12:55:37.287  INFO 7124 --- [           main] o.s.d.r.w.RepositoryRestHandlerMapping   : Mapped "{[/{repository}/{id}/{property}],methods=[PATCH || PUT || POST],consumes=[application/json || application/x-spring-data-compact+json || text/uri-list],produces=[application/hal+json || application/json]}" onto public org.springframework.http.ResponseEntity<? extends org.springframework.hateoas.ResourceSupport> org.springframework.data.rest.webmvc.RepositoryPropertyReferenceController.createPropertyReference(org.springframework.data.rest.webmvc.RootResourceInformation,org.springframework.http.HttpMethod,org.springframework.hateoas.Resources<java.lang.Object>,java.io.Serializable,java.lang.String) throws java.lang.Exception
    2017-05-18 12:55:37.288  INFO 7124 --- [           main] o.s.d.r.w.RepositoryRestHandlerMapping   : Mapped "{[/{repository}/search],methods=[GET],produces=[application/hal+json || application/json]}" onto public org.springframework.data.rest.webmvc.RepositorySearchesResource org.springframework.data.rest.webmvc.RepositorySearchController.listSearches(org.springframework.data.rest.webmvc.RootResourceInformation)
    2017-05-18 12:55:37.288  INFO 7124 --- [           main] o.s.d.r.w.RepositoryRestHandlerMapping   : Mapped "{[/{repository}/search/{search}],methods=[HEAD],produces=[application/hal+json || application/json]}" onto public org.springframework.http.ResponseEntity<java.lang.Object> org.springframework.data.rest.webmvc.RepositorySearchController.headForSearch(org.springframework.data.rest.webmvc.RootResourceInformation,java.lang.String)
    2017-05-18 12:55:37.289  INFO 7124 --- [           main] o.s.d.r.w.RepositoryRestHandlerMapping   : Mapped "{[/{repository}/search/{search}],methods=[GET],produces=[application/hal+json || application/json]}" onto public org.springframework.http.ResponseEntity<?> org.springframework.data.rest.webmvc.RepositorySearchController.executeSearch(org.springframework.data.rest.webmvc.RootResourceInformation,org.springframework.util.MultiValueMap<java.lang.String, java.lang.Object>,java.lang.String,org.springframework.data.rest.webmvc.support.DefaultedPageable,org.springframework.data.domain.Sort,org.springframework.data.rest.webmvc.PersistentEntityResourceAssembler,org.springframework.http.HttpHeaders)
    2017-05-18 12:55:37.289  INFO 7124 --- [           main] o.s.d.r.w.RepositoryRestHandlerMapping   : Mapped "{[/{repository}/search],methods=[HEAD],produces=[application/hal+json || application/json]}" onto public org.springframework.http.HttpEntity<?> org.springframework.data.rest.webmvc.RepositorySearchController.headForSearches(org.springframework.data.rest.webmvc.RootResourceInformation)
    2017-05-18 12:55:37.290  INFO 7124 --- [           main] o.s.d.r.w.RepositoryRestHandlerMapping   : Mapped "{[/{repository}/search/{search}],methods=[OPTIONS],produces=[application/hal+json || application/json]}" onto public org.springframework.http.ResponseEntity<java.lang.Object> org.springframework.data.rest.webmvc.RepositorySearchController.optionsForSearch(org.springframework.data.rest.webmvc.RootResourceInformation,java.lang.String)
    2017-05-18 12:55:37.291  INFO 7124 --- [           main] o.s.d.r.w.RepositoryRestHandlerMapping   : Mapped "{[/{repository}/search/{search}],methods=[GET],produces=[application/x-spring-data-compact+json]}" onto public org.springframework.hateoas.ResourceSupport org.springframework.data.rest.webmvc.RepositorySearchController.executeSearchCompact(org.springframework.data.rest.webmvc.RootResourceInformation,org.springframework.http.HttpHeaders,org.springframework.util.MultiValueMap<java.lang.String, java.lang.Object>,java.lang.String,java.lang.String,org.springframework.data.rest.webmvc.support.DefaultedPageable,org.springframework.data.domain.Sort,org.springframework.data.rest.webmvc.PersistentEntityResourceAssembler)
    2017-05-18 12:55:37.291  INFO 7124 --- [           main] o.s.d.r.w.RepositoryRestHandlerMapping   : Mapped "{[/{repository}/search],methods=[OPTIONS],produces=[application/hal+json || application/json]}" onto public org.springframework.http.HttpEntity<?> org.springframework.data.rest.webmvc.RepositorySearchController.optionsForSearches(org.springframework.data.rest.webmvc.RootResourceInformation)
    2017-05-18 12:55:37.294  INFO 7124 --- [           main] o.s.d.r.w.BasePathAwareHandlerMapping    : Mapped "{[/profile],methods=[GET]}" onto org.springframework.http.HttpEntity<org.springframework.hateoas.ResourceSupport> org.springframework.data.rest.webmvc.ProfileController.listAllFormsOfMetadata()
    2017-05-18 12:55:37.295  INFO 7124 --- [           main] o.s.d.r.w.BasePathAwareHandlerMapping    : Mapped "{[/profile],methods=[OPTIONS]}" onto public org.springframework.http.HttpEntity<?> org.springframework.data.rest.webmvc.ProfileController.profileOptions()
    2017-05-18 12:55:37.295  INFO 7124 --- [           main] o.s.d.r.w.BasePathAwareHandlerMapping    : Mapped "{[/profile/{repository}],methods=[GET],produces=[application/alps+json || */*]}" onto org.springframework.http.HttpEntity<org.springframework.data.rest.webmvc.RootResourceInformation> org.springframework.data.rest.webmvc.alps.AlpsController.descriptor(org.springframework.data.rest.webmvc.RootResourceInformation)
    2017-05-18 12:55:37.295  INFO 7124 --- [           main] o.s.d.r.w.BasePathAwareHandlerMapping    : Mapped "{[/profile/{repository}],methods=[OPTIONS],produces=[application/alps+json]}" onto org.springframework.http.HttpEntity<?> org.springframework.data.rest.webmvc.alps.AlpsController.alpsOptions()
    2017-05-18 12:55:37.296  INFO 7124 --- [           main] o.s.d.r.w.BasePathAwareHandlerMapping    : Mapped "{[/profile/{repository}],methods=[GET],produces=[application/schema+json]}" onto public org.springframework.http.HttpEntity<org.springframework.data.rest.webmvc.json.JsonSchema> org.springframework.data.rest.webmvc.RepositorySchemaController.schema(org.springframework.data.rest.webmvc.RootResourceInformation)
    2017-05-18 12:55:37.465  INFO 7124 --- [           main] o.s.j.e.a.AnnotationMBeanExporter        : Registering beans for JMX exposure on startup
    2017-05-18 12:55:37.602  INFO 7124 --- [           main] s.b.c.e.t.TomcatEmbeddedServletContainer : Tomcat started on port(s): 8000 (http)

    发现多了很多rest api的映射,这表示成功了。

    访问http://localhost:8000/notes/1,可以看到rest api已经直接可用了。hal+json 的格式,如果有疑问可留言。

  • 相关阅读:
    在传统软件公司十年深恶痛绝的感受
    前端 100 问:能搞懂80%的请把简历给我
    中专毕业的他,是如何逆袭为 360 资深程序员?
    别再参加领导力培训课程了,这本领导力提升书籍推荐给你
    企业管理书籍推荐,读完这个系列的书就是上完了整个MBA
    如何做好人才管理?人才管理书籍推荐
    如何管理好员工?你可能需要看看这本人员工管理方面的经典书籍
    领导与管理的区别和异同:什么是领导?什么是管理?
    一名优秀的HR需要具备哪些素质与能力?
    销售书籍推荐:做销售你究竟该看什么书?
  • 原文地址:https://www.cnblogs.com/mignet/p/spring_boot_jap_rest.html
Copyright © 2020-2023  润新知