인프런 커뮤니티 질문&답변

신동평님의 프로필 이미지

작성한 질문수

스프링 웹 MVC

Spring MVC @Valid 오작동 관련

작성

·

287

0

안녕하세요 강의 잘 봤습니다. 좋은 강의 고맙습니다.

질문 있어 이렇게 글을 남깁니다. 

Spring Validation이 원활하게 되지 않습니다. PostMan/SpringUnitTest를 통해도 되지 않습니다.

제가 분명 어떤것을 빼먹은 것 같지만 구글링해도 해결되지 않아, 이렇게 게실글을 남깁니다.

UserControllerTest는 '제 생각에는' 실패 해야하는데, 계속 성공합니다.

제 코드는 아래와 같습니다.

UserController

package net.glaso.rest.practice.user;

import org.springframework.http.HttpHeaders;
import org.springframework.http.ResponseEntity;
import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.context.request.WebRequest;

import javax.validation.Valid;


@RestController
@RequestMapping("user-info")
public class UserController {

    @RequestMapping
    public String test() {
        System.out.println("test");
        return "{\"test\":\"test\"}";
    }

    @PostMapping
    public ResponseEntity<UserInfo> create(@Valid @RequestBody UserInfo userInfo, BindingResult result, @RequestHeader HttpHeaders headers, WebRequest request ) {
        if ( result.hasErrors() ) {
            System.out.println( "error" );
            throw new IllegalArgumentException( "test" );
        }
        System.out.println( userInfo );
        System.out.println( request.isSecure());
        System.out.println( headers.get( HttpHeaders.CONTENT_TYPE ) );
        return ResponseEntity.ok( userInfo );
    }

}

UserInfo

package net.glaso.rest.practice.user;

import javax.validation.constraints.*;

public class UserInfo {

    @NotBlank
    private int seqId;

    @NotBlank
    private String userId;

    @NotBlank
    private String name;

    @NotBlank
    private String test;

.. getter/setter

UserControllerTest

@RunWith(SpringRunner.class)
@WebAppConfiguration
@ContextConfiguration(classes= {WebConfig.class, AppConfig.class})
public class UserControllerTest {

    private MockMvc mockMvc;
    private ObjectMapper objectMapper;

    @Before
    public void init() {
        this.mockMvc = MockMvcBuilders.standaloneSetup( new UserController() ).build();
        this.objectMapper = new ObjectMapper();
        objectMapper.setSerializationInclusion( JsonInclude.Include.NON_NULL );
    }

    @Test
    public void create() throws Exception {

        UserInfo userInfo = new UserInfo();

        userInfo.setName( "shin" );
        userInfo.setUserId( " " );


        String jsonData = objectMapper.writeValueAsString( userInfo );

        System.out.println( "reqData : " + jsonData );

        mockMvc.perform( post( "/user-info" )
                        .header(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE )
                        .header(HttpHeaders.ACCEPT, MediaType.APPLICATION_JSON_VALUE )
                        .header(HttpHeaders.CONTENT_ENCODING, "UTF-8" )
                        .content( jsonData )
                )
                .andDo( print() )
                .andExpect( status().isOk() );

    }

}

AppConfig

@Configuration
@ComponentScan(
        basePackages = "net.glaso.rest.practice",
        useDefaultFilters=false,
        excludeFilters = @ComponentScan.Filter(Controller.class),
        includeFilters = {
                @ComponentScan.Filter(ControllerAdvice.class),
                @ComponentScan.Filter(Service.class),
                @ComponentScan.Filter(Repository.class)
        }
)
@EnableTransactionManagement(order = 200)
public class AppConfig{

}

WebConfig

@Configuration
@ComponentScan( basePackages="net.glaso.rest.practice", useDefaultFilters=false, includeFilters=@ComponentScan.Filter(Controller.class) )
@EnableWebMvc
public class WebConfig implements WebMvcConfigurer {

}

사용라이브러리

javax.validation-api 2.0

jackson

Servlet 4.0

Java 8

Spring context/context-support/core/expression/jdbc/test/tx/web/webmvc/aop/beans

고맙습니다.

답변 4

0

백기선님의 프로필 이미지
백기선
지식공유자

아.. 스프링 부트를 쓰고 있지 않으셨군요. 스프링 부트를 쓰세요 훨씬 편합니다.

0

신동평님의 프로필 이미지
신동평
질문자

아음.. 황당한 실수를 저지른것 같습니다.

Bean Validation의 구현체, 라이브러리를 추가하지 않았습니다. hibernate-validator를 추가하여 해결하였습니다... 

백기선 선생님 신경써주셔서 감사합니다.  

ps. 조만간 부트 강의 듣는데, 부트에서 Configuration을 사용하면 어떻게되는지 확인해보겠습니다.!

0

신동평님의 프로필 이미지
신동평
질문자

답변 감사드립니다.  저는 스프링 부트가 아니고, MVC입니다. 스프링 부트를 사용해본적은 없습니다. 그래서 WebMvcConfigurere를 구현한 클래스에 @Configuration을 사용하면 어떤일이 벌어지는지 잘 모릅니다. 

0

백기선님의 프로필 이미지
백기선
지식공유자

마지막에 있는 WebConfig 설정에 @Configuration을 일부러 사용하신건가요? 스프링 부트 애플리케이션에서 WebMvcConfigurere를 구현한 클래스에 @Configuration을 사용하면 어떤 일이 벌어지는지 알고 쓰신건지 궁금합니다.