Micronaut 不会在多部分中映射对象

问题描述 投票:0回答:1

所以..我有一个消耗multipart/form-data的方法。我正在尝试传递一个名为 User 的对象(忽略某些字段)和用户头像文件


@ExecuteOn(TaskExecutors.IO)
@Operation(summary = "Endpoint for user registration")
@Post(uri = "/register",consumes = {MediaType.MULTIPART_FORM_DATA},produces = MediaType.APPLICATION_JSON)
@Requires(bean = User.class)
public HttpResponse<DefaultAppResponse> register(
        @Part("credential")  User credential,
        @Part("avatar") @Nullable CompletedFileUpload avatar
){
    try {
        if(avatar != null) {
            Files saved = filesService.save(avatar, dirPattern + avatars);
            saved.setOid(transactionalRepository.genOid().orElseThrow());
            filesRepository.save(saved);
            credential.setAvatarPath(saved);
        }
        credential.setUserRegDate(new Date(System.currentTimeMillis()));
        userRepository.save(credential);
        return HttpResponse.ok(
                errorService.success()).status(201
        );
    } catch (Exception e) {
        registerLog.error(e.getMessage(), e.getStackTrace());
        throw new InternalExceptionResponse("Error: " +e.getMessage() , errorService.error("error: " +e.getMessage()));
    }

}

用户.class

@Entity
@Table(name = "users", schema = "public")
@Introspected
@JsonView(Default.class)
public class User extends BaseEntity{
    @JsonInclude
    @JsonProperty("user_name")
    @Column(name = "user_name")
    @JsonAlias("userName")
    private String userName;
    @JsonInclude
    @JsonProperty("user_birthday")
    @Column(name = "user_birthday")
    @JsonAlias("userBirthday")
    @JsonFormat(pattern = "yyyy-MM-dd")
    private Date userBirthday;

    @JsonInclude
    @JsonFormat(pattern = "yyyy-MM-dd")
    @JsonProperty("user_reg_date")
    @Column(name = "user_reg_date")
    @JsonAlias("userRegDate")
    private Date userRegDate;

    @JsonInclude
    @JsonProperty("user_email")
    @Column(name = "user_email")
    @JsonAlias("userEmail")
    private String userEmail;


    @JsonProperty("user_password")
    @Column(name = "user_password")
    @JsonAlias("userPassword")
    @JsonView(WithPassword.class)
    private String userPassword;

    @ManyToOne
    @JoinColumn(name = "avatar_path")
    @JsonProperty("avatar_path")
    @JsonInclude
    @JsonAlias("avatarPath")
    private Files avatarPath;

    @JsonInclude
    @JsonProperty("user_phone_number")
    @Column(name = "user_phone_number")
    @JsonAlias("userPhoneNumber")
    private String userPhoneNumber;

    @JsonInclude
    @JsonProperty("user_is_confirm")
    @Column(name = "user_is_confirm")
    @JsonAlias("userIsConfirm")
    private Boolean userIsConfirm;

    public User(
            String oid, String userName,
            Date userBirthday, Date userRegDate, String userEmail, String userPassword, Files avatarPath,
            String userPhoneNumber, Boolean userIsConfirm
    ) {
        super(oid);
        this.userName = userName;
        this.userBirthday = userBirthday;
        this.userRegDate = userRegDate;
        this.userEmail = userEmail;
        this.userPassword = userPassword;
        this.avatarPath = avatarPath;
        this.userPhoneNumber = userPhoneNumber;
        this.userIsConfirm = userIsConfirm;
    }

    public User() {

    }

    public Files getAvatarPath() {
        return avatarPath;
    }

    public void setAvatarPath(Files avatarPath) {
        this.avatarPath = avatarPath;
    }

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public Date getUserBirthday() {
        return userBirthday;
    }

    public void setUserBirthday(Date userBirthday) {
        this.userBirthday = userBirthday;
    }

    public Date getUserRegDate() {
        return userRegDate;
    }

    public void setUserRegDate(Date userRegDay) {
        this.userRegDate = userRegDay;
    }

    public String getUserEmail() {
        return userEmail;
    }

    public void setUserEmail(String userEmail) {
        this.userEmail = userEmail;
    }

    public Boolean getUserIsConfirm() {
        return userIsConfirm;
    }

    public void setUserIsConfirm(Boolean userIsConfirm) {
        this.userIsConfirm = userIsConfirm;
    }

    public String getUserPassword() {
        return userPassword;
    }

    public void setUserPassword(String userPassword) {
        this.userPassword = userPassword;
    }

    public String getUserPhoneNumber() {
        return userPhoneNumber;
    }

    public void setUserPhoneNumber(String userPhoneNumber) {
        this.userPhoneNumber = userPhoneNumber;
    }

}

但是,当我尝试传输对象时,它根本无法接受/解析/映射它(正确下划线)我会得到什么响应

请求(大摇大摆)

Request Picture

回复

{
  "message": "Bad Request",
  "_links": {
    "self": {
      "href": "/api/reg/register",
      "templated": false
    }
  },
  "_embedded": {
    "errors": [
      {
        "message": "Required Part [credential] not specified",
        "path": "/credential"
      }
    ]
  }
}

如果我删除

@Part("credentails")
,那么它将包含一个字段等于 null 的实体。 看截图

调试评估

Debug Evaluation

在我的研究中,我发现

type:application/json
没有被传递。但是头像文件有
type:image/png
。请参阅 CURL 请求(从 swagger 生成)

curl -X 'POST' \
  'http://localhost:8080/api/reg/register' \
  -H 'accept: application/json' \
  -H 'Content-Type: multipart/form-data' \
  -F 'credential={
  "oid": "null",
  "avatar_path": "null"
  "user_reg_date": "null",
  "user_name": "User FUllName"
  "user_birthday": "2001-10-28",
  "user_email": "[email protected]",
  "user_password": "123123",
  "user_phone_number": "some-valid-phone-number"
}' \
  -F '[email protected];type=image/png'

问题:可能是什么问题?

mapping multipartform-data micronaut
1个回答
0
投票

我最近也遇到了同样的问题。
我找到的解决方案(效果很好):

请求处理程序:

@Post
@Consumes(value = [MULTIPART_FORM_DATA])
fun createOrganisation(
    principal: PrincipalUser,
    @Body request: RequestCreateOrg,
    @Part image: CompletedFileUpload? = null,
)

我的 dto:

import com.fasterxml.jackson.databind.annotation.JsonDeserialize


data class RequestCreateOrg(
    val name: String,

    @JsonDeserialize(converter = RequestCreateOrgOwnerConverter::class)
    val owner: RequestCreateOrgOwner? = null,
)

已实施

class RequestCreateOrgOwnerConverter : Converter<String, RequestCreateOrgOwner>

© www.soinside.com 2019 - 2024. All rights reserved.