게시글
질문&답변
2021.08.02
카프카 커넥트 서버 기동시 발생하는 오류
저도 같은 문제가 발생했습니다만 해결되어 글을 남깁니다. Kafka Connect에서 설정 관련 디렉토리는 config가 아닌 etc 입니다. 하지만 connect-distributed.bat에서는 log4j의 경로를 존재하지 않는 %BASE_DIR%/config/connect-log4j.properties으로 잡고 있습니다. 따라서 connect-distributed.bat의 log4j 경로를 %BASE_DIR%/config/connect-log4j.properties에서 %BASE_DIR%/etc/kafka/connect-log4j.properties로 바꾸어주면 해결 가능합니다.
- 4
- 5
- 3.9K
질문&답변
2021.06.07
Swagger와 Jackson Filter 사용 시 Swagger-ui의 example value
저 또한 Postman을 이용하여 'GET /users/1'에 대한 Request로 다음과 같은 Response를 정상적으로 받고 있습니다. (사진) User controller의 'GET /users/{id}' 요청은 JsonFilter를 적용하여 MappingJacksonValue를 반환하도록 코드를 작성하였으며, 이로인해 Swagger-ui에서 User controller의 'GET /users/{id}'에 대한 Example value에서 다음과 같이 User Domain 클래스의 필드 구조를 제대로 보여주지 않았고 이를 문제라고 생각하였습니다. (사진) 필터를 적용하지 않고, EntityModel를 반환하는 경우는 다음과 같이 example value가 올바르게 표시됩니다. 저는 MappingJacksonValue와 EntitiyModel, 즉, 반환값의 차이에서 이러한 문제가 발생했다고 생각하고 있습니다. (사진) swagger-ui Models의 User에서는 User Domain Class에 대한 정보를 올바르게 표시하고 있습니다. (사진) 다음은 작성한 User.java, UserController.java, pom.xml의 코드 입니다. User.java package com.example.restfulwebservice.user;import com.fasterxml.jackson.annotation.JsonFilter;import com.fasterxml.jackson.annotation.JsonIgnore;import com.fasterxml.jackson.annotation.JsonIgnoreProperties;import io.swagger.annotations.ApiModel;import io.swagger.annotations.ApiModelProperty;import lombok.AllArgsConstructor;import lombok.Data;import lombok.NoArgsConstructor;import javax.validation.constraints.Past;import javax.validation.constraints.Size;import java.util.Date;@Data@AllArgsConstructor@NoArgsConstructor//@JsonIgnoreProperties(value = {"password", "ssn"})@JsonFilter("UserInfo")@ApiModel(description = "사용자 상세 정보를 위한 도메인 객체")public class User { private Integer id; @Size(min=2, message = "Name은 2글자 이상 입력해 주세요.") @ApiModelProperty(notes = "사용자 이름을 입력해 주세요.") private String name; // 미래 데이터 사용 X @Past @ApiModelProperty(notes = "사용자 등록일을 입력해 주세요.") private Date joinDate; @ApiModelProperty(notes = "사용자 비빌번호를 입력해 주세요.") private String password; @ApiModelProperty(notes = "사용자 주민등록번호를 입력해 주세요.") private String ssn;} UserController.java package com.example.restfulwebservice.user;import com.fasterxml.jackson.databind.ser.FilterProvider;import com.fasterxml.jackson.databind.ser.impl.SimpleBeanPropertyFilter;import com.fasterxml.jackson.databind.ser.impl.SimpleFilterProvider;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.hateoas.CollectionModel;import org.springframework.hateoas.EntityModel;import org.springframework.hateoas.server.mvc.WebMvcLinkBuilder;import org.springframework.http.ResponseEntity;import org.springframework.http.converter.json.MappingJacksonValue;import org.springframework.web.bind.annotation.*;import org.springframework.web.servlet.support.ServletUriComponentsBuilder;import javax.validation.Valid;import java.net.URI;import java.util.ArrayList;import java.util.List;import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.linkTo;import static org.springframework.hateoas.server.mvc.WebMvcLinkBuilder.methodOn;@RestControllerpublic class UserController { @Autowired private UserDaoService service; // public UserController(UserDaoService service) { // this.service = service; // } @GetMapping("/users") public List> retrieveAllUsers() { List> models = new ArrayList(); List users = service.findAll(); // HATEOAS for (User user : users) { EntityModel model = EntityModel.of(user); model.add(linkTo(methodOn(this.getClass()).retrieveAllUsers()).withSelfRel()); models.add(model); } // JacksonFilter // SimpleBeanPropertyFilter filter = SimpleBeanPropertyFilter // .filterOutAllExcept("id", "name", "joinDate"); // FilterProvider filters = new SimpleFilterProvider().addFilter("UserInfo", filter); // // MappingJacksonValue mapping = new MappingJacksonValue(models); // mapping.setFilters(filters); return models; } @GetMapping("/users/{id}") public MappingJacksonValue retrieveUser(@PathVariable int id) { User user = service.findOne(id); if (user == null) { throw new UserNotFoundException(id); } // HATEOAS EntityModel model = EntityModel.of(user); WebMvcLinkBuilder linkTo = linkTo(methodOn(this.getClass()).retrieveAllUsers()); model.add(linkTo.withRel("all-users")); linkTo = linkTo(methodOn(this.getClass()).updateUser(user, id)); model.add(linkTo.withRel("update-user")); // JacksonFilter SimpleBeanPropertyFilter filter = SimpleBeanPropertyFilter .filterOutAllExcept("id", "name", "joinDate"); FilterProvider filters = new SimpleFilterProvider().addFilter("UserInfo", filter); MappingJacksonValue mapping = new MappingJacksonValue(model); mapping.setFilters(filters); return mapping; } @PostMapping("/users") public ResponseEntity createUser(@Valid @RequestBody User user) { User savedUser = service.save(user); URI location = ServletUriComponentsBuilder.fromCurrentRequest() .path("/{id}") .buildAndExpand(savedUser.getId()) .toUri(); return ResponseEntity.created(location).build(); } @DeleteMapping("/users/{id}") public void deleteUser(@PathVariable int id) { User user = service.deleteById(id); if (user == null) { throw new UserNotFoundException(id); } } @PutMapping("/users/{id}") public ResponseEntity updateUser(@RequestBody User user, @PathVariable int id) { User updatedUser = service.update(user, id); if (updatedUser != null) { return ResponseEntity.noContent().build(); } else { throw new UserNotFoundException(id); } }} pom.xml xml version="1.0" encoding="UTF-8"?>xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"> 4.0.0 org.springframework.boot spring-boot-starter-parent 2.4.5 com.example restful-web-service 0.0.1-SNAPSHOT restful-web-service Demo project for Spring Boot 16 org.springframework.boot spring-boot-starter-data-jpa org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-validation org.springframework.boot spring-boot-devtools runtime true com.h2database h2 runtime org.projectlombok lombok true org.springframework.boot spring-boot-starter-test test org.springframework.boot spring-boot-starter-hateoas test org.assertj assertj-core com.fasterxml.jackson.dataformat jackson-dataformat-xml 2.10.2 org.springframework.hateoas spring-hateoas io.springfox springfox-boot-starter 3.0.0 org.springframework.boot spring-boot-starter-actuator org.springframework.data spring-data-rest-hal-explorer 3.5.1 org.springframework.boot spring-boot-starter-security org.springframework.boot spring-boot-maven-plugin org.projectlombok lombok
- 0
- 2
- 1.4K