LoginSignup
0
1

More than 1 year has passed since last update.

SpringBoot @PostMappingについて

Posted at

@PostMappingアノテーションが定義しているメソッドは与えられたURI表現式と一致するHTTP POSTの要請を処理します。

// import 省略
@RequestMapping(value = "/api/person") 
@RestController 
@Slf4j
public class PersonController {
    @Autowired
    private PersonService personService;

    @Autowired
    private PersonRepository personRepository;

    @GetMapping("/{id{")
    public Person getPerson(@PathVariable Long id) {
        return personService.getPerson(id);
    }

    @PostMapping
    @ResponseStatus(HttpStatus.OK)
    public void postPerson(@RequestBody Person person) {
        personService.put(person);
        log.info("person -> {}", personRepository.findAll());
    }
}

@RestControllerは、PersonControllerクラスはREST API Controllerを使用しますよとの宣言アノテーションです。
クラスに定義している@RequestMappin(value="/api/person")のscopeはクラス全体なので、
postPerson()は("/api/person")のURIに対応します。
log.info()の"{}"には、二つ目のfindAll()が出力されます。log.inforを使うには@Slf4j定義が要!

PersonControllerTest
// import 省略
@SpringBootTest
public class PersonControllerTest {

    @Autowired
    private PersonController personController;

    private MockMvc mockMvc;

    @Test
    void getPerson() throws Exception {
        mockMvc = MockMvcBuilders.standaloneSetup(personController).build();

        mockMvc.perform(
                MockMvcRequestBuilders.get("/api/person/1"))
                .andDo(MockMvcResultHandlers.print())
                .andExpect(MockMvcResultMatchers.status().isOk());
    }

    @Test
    void postPerson() throws Exception {
        mockMvc = MockMvcBuilders.standaloneSetup(personController).build();

        mockMvc.perform(
                MockMvcRequestBuilders.post("/api/person")
                       .contentType(MediaType.APPLICATION_JSON)
                       .content("{\n" +
                        "    \"name\": \"martin2\", \n" +
                        "    \"age\": 20, \n" +
                        "    \"bloodType\": \"A\"\n" +
                        "}"))
                        .andDo(print())
                        .andExpect(status().isCreated());
//                        .andExpect(status().isOk());
    }
}

PersonControllerクラスのテストコードです。
personConteollerにDI(Dependency Injection)して、mockmvcを生成してます。
MockMvcRequestBuildersのpostは、PersonControllerの@PostMapping定義メソッドに相当します。
contentにはjsonデータのため、contentTypeにJSONを定義しなければなりません。
PersonControllerのpostPersonに定義したのは「@ResponseStatus(HttpStatus.OK)」のため、
andExpectをstatus().isOK()の確認をしています。
もし、データがちゃんと作られたかを確認したい場合は
isOK → isCreated()に変えて
@ResponseStatus(HttpStatus.OK) → @ResponseStatus(HttpStatus.CREATED)に変えればOK!
追記で、conetentにjsonのデータが入っていますが、.jsonファイルに以下のように書きコピーして
.content("")に貼り付ければ簡単に整形されます!
image.png

テスト結果!
image.png

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1