问题描述
按照此链接,我采用了类似的方法,并创建了一个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对其进行注释,则它显示为参数。请查看下面的屏幕截图
请帮助我解决此问题。如果我错过了一些步骤或如何措手不及,请理解此注释以将其显示为@RequestBody。 注意:如果我从邮递员手动传递UserDTO,则它会正确转换为User,但是文档部分失败。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)