挥舞一下以了解Spring Boot中的自定义注释

问题描述

按照此链接,我采用了类似的方法,并创建了一个spring boot项目。 https://auth0.com/blog/automatically-mapping-dto-to-entity-on-spring-boot-apis/

这是我的自定义注释的外观

@Target(ElementType.ParaMETER)
@Retention(RetentionPolicy.RUNTIME)
public @interface RequestDTO {
    Class value();
}

我的Rest Api方法如下:

public ResponseEntity<?> registerUser(@RequestDTO(value = UserDTO.class) User user)

下面是我的UserDTO类

@NoArgsConstructor
@Data
public class UserDTO {
    
    private Long id;
    private String userName;
    private String password;
    private String emailId;
    private String contactNumber;
    private String firstName;
    private String middleName;
    private String lastName;
    
    
}

最后这是我的实体类

@Entity
@Table(name = "USER")
public class User {
    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ID")
    @ApiModelProperty(hidden = true)
    private Long id;
    @Column(name = "USERNAME")
    private String userName;
    @Column(name = "PASSWORD")
    private String password;
    @Column(name = "EMAIL_ID")
    private String emailId;
    @Column(name = "CONTACT_NUMBER")
    private String contactNumber;
    @Column(name = "FirsT_NAME")
    private String firstName;
    @Column(name = "MIDDLE_NAME")
    private String middleName;
    @Column(name = "LAST_NAME")
    private String lastName;

我的DTO处理器

public class DTOMethodProcessor extends RequestResponseBodyMethodProcessor {

    @Autowired
    private modelmapper modelmapper;

    public DTOMethodProcessor(ObjectMapper objectMapper) {
        super(Collections.singletonList(new MappingJackson2HttpMessageConverter(objectMapper)));
    }

    @Override
    public boolean supportsParameter(MethodParameter parameter) {
        return parameter.hasParameterannotation(RequestDTO.class);
    }

     //uncomment to force validate
    /*
     * @Override protected void validateIfApplicable(WebDataBinder binder,* MethodParameter parameter) { binder.validate(); }
     */

    @Override
    public Object resolveArgument(MethodParameter parameter,ModelAndViewContainer mavContainer,NativeWebRequest webRequest,WebDataBinderFactory binderFactory) throws Exception {
        Object dto = super.resolveArgument(parameter,mavContainer,webRequest,binderFactory);
        return modelmapper.map(dto,parameter.getParameterType());
    }

    @Override
    protected Object readWithMessageConverters(HttpInputMessage inputMessage,MethodParameter parameter,Type targettype) throws IOException,HttpMediaTypeNotSupportedException,HttpMessageNotReadableException {
        for (Annotation ann : parameter.getParameterannotations()) {
            RequestDTO dtoType = AnnotationUtils.getAnnotation(ann,RequestDTO.class);
            if (dtoType != null) {
                return super.readWithMessageConverters(inputMessage,parameter,dtoType.value());
            }
        }
        throw new RuntimeException();
    }
}

WebMVC配置

@Configuration
public class WebMvcConfig implements WebMvcConfigurer{

    
    @Autowired
    private ApplicationContext applicationContext;
    
    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        ObjectMapper objectMapper = Jackson2ObjectMapperBuilder.json().applicationContext(this.applicationContext).build();
        argumentResolvers.add(new DTOMethodProcessor(objectMapper));
    }
    
}

但是我正面临着招摇的问题。如果我使用@RequestBody注释我的参数,则可以使用Swagger文档而不是@RequestDTO,将其正确显示为json主体。但是,如果我用@RequestDTO对其进行注释,则它显示为参数。请查看下面的屏幕截图

enter image description here

请帮助我解决此问题。如果我错过了一些步骤或如何措手不及,请理解此注释以将其显示为@RequestBody。 注意:如果我从邮递员手动传递UserDTO,则它会正确转换为User,但是文档部分失败。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)