inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

스프링 웹 MVC

Spring MVC @Valid 오작동 관련

356

신동평

작성한 질문수 1

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

고맙습니다.

spring MVC java

답변 4

0

백기선

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

0

신동평

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

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

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

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

0

신동평

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

0

백기선

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

7:58 예제 코드 찾는 법

0

256

2

PATCH의 Idempotent에 대한 질문

0

257

1

2:51초 질문입니다.

0

324

1

만약 어플리케이션컨텍스트에 필터를 설정하지 않으면 어떻게되나요?

0

361

0

web.xml에 위치한 애플리케이션 web.xml 내에서 파싱 오류 발생

0

515

0

Spring Boot 2.6 이상 버전에서의 DispatcherServlet

0

366

1

Event`Xxx`Controller 분리할때의 기준에 관한 질문입니다.

0

634

1

11분 57초 쯤, `returnValueHandlers` 들의 네이밍컨벤션 관련 질문입니다.

0

379

1

@EnableWebmvc 설정을 하면

0

415

1

springframework와의 차이점

0

283

1

@RequestBody의 바인딩에러를 잡는 방법

1

1655

2

안녕하세요 기선님 강의를 보다 서블릿에 궁금증이 생겨 질문 드립니다

1

236

1

HelloService의 값을 전달을 못 받습니다.

0

296

1

ServletContext와 WebApplicationContext의 관계 질문

1

740

1

하나의 서비스에, 두개의 리포지토리도 연결이 되나요?

0

364

1

view name 리턴에 대해

0

290

2

Formatter print 질문 드립니다.

0

232

1

에리 메시지가 한글입니다.

0

293

1

java 클래스파일로 설정되어 있던 것을 web.xml로 바꾸는 경우

0

338

1

@RequestParam

0

255

1

@Retention 질문

0

229

1

Event.builder() 관련 mac에서 lombok 문제 있으신 분들

0

198

1

스프링 부트 사용시 WebMvcConfigurerSupport 클래스

0

252

1

http://localhost:8080/hello 입력시 오류

0

491

4