작성
·
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을 사용하면 어떤 일이 벌어지는지 알고 쓰신건지 궁금합니다.