Почему BlazeDS не сериализует некоторые поля? - PullRequest
0 голосов
/ 07 сентября 2010

Я использую Flex 3.5, BlazeDS 3.2.0.3978 и EJB3 для бэкэнда. Есть два RPC, которые важны для проблемы. Первый вызов получит список объектов ThirdParty, это прекрасно работает. Второй вызов происходит, когда пользователь нажимает на ThirdParty, извлекаются сведения об этом объекте (ленивые коллекции). Один объект возвращается с большинством полей сериализации. Я говорю больше всего, потому что по какой-то причине 4 логических поля не сериализуются и по умолчанию имеют значение flex по умолчанию.

Вот боб Java:

package com.rekencentra.svc.cfos.model.security;


@Entity
@Table(
    name = "AUTH_THP",
    uniqueConstraints = {
        @UniqueConstraint(columnNames={"THP_ID", "OTH_THP_ID"})
    }
)
@NamedQueries({
    @NamedQuery(
        name="allAuthorizationsForThp",
        query="SELECT DISTINCT c FROM AuthorisationThirdParty c " +
                " LEFT JOIN FETCH c.otherThirdParty thp" +
                " LEFT JOIN FETCH thp.goodRegulation" +
                " WHERE c.thirdParty.id = :id" +
                " AND c.authValidFrom = sysdate()"
            )}
)

@SequenceGenerator(name="seqSerialId", sequenceName="SEQ_AUTH_THP")
public class AuthorisationThirdParty extends BusinessObject {

    private static final long serialVersionUID = -4187381385945255374L;

    @ManyToOne(fetch=FetchType.LAZY, cascade = {CascadeType.REFRESH})
    @JoinColumn(name="THP_ID", nullable=false)
    private ThirdParty thirdParty;

    @ManyToOne(fetch=FetchType.EAGER, cascade = {CascadeType.REFRESH})
    @JoinColumn(name="OTH_THP_ID", nullable=false)
    private ThirdParty otherThirdParty;

    @Column(name="ICT_F", nullable=false)
    private Boolean authForTemplates;

    @Column(name="ICN_F", nullable=false)
    private Boolean authForConsignments;

    @Column(name="SC_F", nullable=false)
    private Boolean authForSalesContracts;

    @Column(name="PC_F", nullable=false)
    private Boolean authForPurchaseContracts;

    @Column(name="FROM_DATE", nullable=true)
    @Temporal(TemporalType.DATE)
    private Date authValidFrom;

    @Column(name="UNTIL_DATE", nullable=true)
    @Temporal(TemporalType.DATE)
    private Date authValidTo;

    public ThirdParty getThirdParty() {
        return thirdParty;
    }

    public void setThirdParty(ThirdParty thirdParty) {
        this.thirdParty = thirdParty;
    }

    public ThirdParty getOtherThirdParty() {
        return otherThirdParty;
    }

    public void setOtherThirdParty(ThirdParty otherThirdParty) {
        this.otherThirdParty = otherThirdParty;
    }

    public Date getAuthValidFrom() {
        return authValidFrom;
    }

    public void setAuthValidFrom(Date authValidFrom) {
        this.authValidFrom = authValidFrom;
    }

    public Date getAuthValidTo() {
        return authValidTo;
    }

    public void setAuthValidTo(Date authValidTo) {
        this.authValidTo = authValidTo;
    }

    public void setAuthForTemplates(Boolean authForTemplates) {
        this.authForTemplates = authForTemplates;
    }

    public boolean isAuthForTemplates() {
          return authForTemplates;
    }

    public void setAuthForConsignments(Boolean authForConsignments) {
        this.authForConsignments = authForConsignments;
    }

    public boolean isAuthForConsignments() {
        return authForConsignments;
    }

    public void setAuthForSalesContracts(Boolean authForSalesContracts) {
        this.authForSalesContracts = authForSalesContracts;
    }

    public boolean isAuthForSalesContracts() {
        return authForSalesContracts;
    }

    public void setAuthForPurchaseContracts(Boolean authForPurchaseContracts) {
        this.authForPurchaseContracts = authForPurchaseContracts;
    }

    public boolean isAuthForPurchaseContracts() {
        return authForPurchaseContracts;
    }
}

и соответствующие классы flex:

package com.rekencentra.ifb.cfos.model.dto.security
{
    [Bindable]
    [ExcludeClass]
    internal class AuthorisationThirdPartyBase extends BusinessObject
    {
        public var thirdParty:ThirdParty;
        public var otherThirdParty:ThirdParty;
        public var authForTemplates:Boolean; // missing ser.
        public var authForConsignments:Boolean; //missing ser.
        public var authForSalesContracts:Boolean; //missing ser.
        public var authForPurchaseContracts:Boolean; //missing ser.
        public var authValidFrom:Date;
        public var authValidTo:Date;
    }
}

package com.rekencentra.ifb.cfos.model.dto.security 
{
    [Bindable]
    [RemoteClass(alias="com.rekencentra.svc.cfos.model.security.AuthorisationThirdParty")]
    public class AuthorisationThirdParty extends AuthorisationThirdPartyBase 
    {
    }
}

Примечание. Я упустил операторы импорта для удобства.

Я настроил ведение журнала blazeDS на отладку и все поля, но эти логические значения отображаются в выходных данных. Затем я попытался пройти процесс сериализации, но там довольно легко заблудиться.

Ответы [ 3 ]

2 голосов
/ 07 сентября 2010

В вашем классе Java нет методов получения пропущенных полей. Сериализатору нужно получить поля, если они должны быть переданы.

1 голос
/ 30 марта 2011
public void setAuthForConsignments(Boolean authForConsignments) {
        this.authForConsignments = authForConsignments;
    }

    public boolean isAuthForConsignments() {
        return authForConsignments;
    }
 }

Можете ли вы попробовать изменить сеттер на примитивное логическое значение?Типы несовместимы: примитив в получателе и обертка в установщике.

Он должен работать как с получателем, так и с установщиком, установленным на примитивное логическое значение, даже если частная переменная установлена ​​на оболочку Boolean.

Однако в случае других типов вы должны использовать пары get и set, включая Strings.

0 голосов
/ 07 сентября 2010

Может быть, методы is не распознаются? Вы должны попытаться переименовать их в методах get.

...