Java GWT:重新绑定结果必须是类
我已经编写了一个生成器类,它为我们的DTO创建了一个简单的适配器。基本上,生成的代码所做的就是查看DTO的所有方法以找到getter,并创建一个getProperty(String)方法以根据属性名称检索属性 在编译器尝试编译GWT.create()语句之前,一切似乎都正常,然后我得到了“必须是类”错误 感谢您的帮助 下面有很多东西来解释这个问题 谢谢 埃德 这是my.gwt.xml的一部分:Java GWT:重新绑定结果必须是类,java,gwt,Java,Gwt,我已经编写了一个生成器类,它为我们的DTO创建了一个简单的适配器。基本上,生成的代码所做的就是查看DTO的所有方法以找到getter,并创建一个getProperty(String)方法以根据属性名称检索属性 在编译器尝试编译GWT.create()语句之前,一切似乎都正常,然后我得到了“必须是类”错误 感谢您的帮助 下面有很多东西来解释这个问题 谢谢 埃德 这是my.gwt.xml的一部分: <generate-with class="com.kn.tls.acsuk.mobile.ge
<generate-with class="com.kn.tls.acsuk.mobile.generator.ModelAdaptorFactoryGenerator" >
<when-type-is class="com.kn.tls.acsuk.mobile.generator.ModelAdaptorFactory"/>
</generate-with>
这是我的生成器生成的代码:
package com.kn.tls.acsuk.mobile.generator;
import com.kn.tls.acsuk.mobile.generator.ModelAdaptor;
import com.kn.tls.acsuk.mobile.dto.BaseMobileDTO;
import com.kn.tls.acsuk.mobile.dto.MobileAuditDetailDTO;
import com.kn.tls.acsuk.mobile.dto.MobileAuditHeaderDTO;
import com.kn.tls.acsuk.mobile.dto.MobileUserDTO;
import com.kn.tls.acsuk.mobile.dto.MobileAuditHeaderCommentDTO;
public class ModelAdaptorFactoryImpl implements ModelAdaptorFactory {
class MobileAuditDetailDTOModelAdaptor implements ModelAdaptor
{
private MobileAuditDetailDTO wrapped;
@Override
public String getProperty(String propertyName)
{
switch (propertyName.toUpperCase())
{
case "TOTALASSETQUANTITY":
return wrapped.getTotalAssetQuantity().toString();
case "ONDISPLAYQUANTITY":
return wrapped.getOnDisplayQuantity().toString();
case "OFFSITEASSETQUANTITY":
return wrapped.getOffsiteAssetQuantity().toString();
case "OUTBOUNDTRANSITQUANTITY":
return wrapped.getOutboundTransitQuantity().toString();
case "INBOUNDTRANSITQUANTITY":
return wrapped.getInboundTransitQuantity().toString();
case "INACCESSIBLEASSETQUANTITY":
return wrapped.getInaccessibleAssetQuantity().toString();
case "DAMAGEDASSETQUANTITY":
return wrapped.getDamagedAssetQuantity().toString();
case "PACKEDASSETQUANTITY":
return wrapped.getPackedAssetQuantity().toString();
case "EMPTYASSETQUANTITY":
return wrapped.getEmptyAssetQuantity().toString();
case "ASSETAUDITHEADER":
return wrapped.getAssetAuditHeader().toString();
case "STOREFULLQUANTITY":
return wrapped.getStoreFullQuantity().toString();
case "STOREEMPTYQUANTITY":
return wrapped.getStoreEmptyQuantity().toString();
case "STOREOTHERQUANTITY":
return wrapped.getStoreOtherQuantity().toString();
case "EMPTYCLEANQUANTITY":
return wrapped.getEmptyCleanQuantity().toString();
case "EMPTYDIRTYQUANTITY":
return wrapped.getEmptyDirtyQuantity().toString();
case "ASSETTYPE":
return wrapped.getAssetType().toString();
case "ID":
return wrapped.getId().toString();
case "CLASS":
return wrapped.getClass().toString();
}
return "";
}
@Override
public void setWrapped(BaseMobileDTO model)
{
this.wrapped = (MobileAuditDetailDTO) model;
}
}
class MobileAuditHeaderDTOModelAdaptor implements ModelAdaptor
{
private MobileAuditHeaderDTO wrapped;
@Override
public String getProperty(String propertyName)
{
switch (propertyName.toUpperCase())
{
case "LOCATION":
return wrapped.getLocation().toString();
case "SCHEDULEDASSETAUDITDATE":
return wrapped.getScheduledAssetAuditDate().toString();
case "SCHEDULEDASSETAUDITOR":
return wrapped.getScheduledAssetAuditor().toString();
case "ACTUALASSETAUDITDATE":
return wrapped.getActualAssetAuditDate().toString();
case "ACTUALASSETAUDITOR":
return wrapped.getActualAssetAuditor().toString();
case "ASSETAUDITSTATUS":
return wrapped.getAssetAuditStatus().toString();
case "ASSETAUDITTYPE":
return wrapped.getAssetAuditType().toString();
case "FIRSTCOMMUNICATIONSENTDATE":
return wrapped.getFirstCommunicationSentDate().toString();
case "FINALCOMMUNICATIONSENTDATE":
return wrapped.getFinalCommunicationSentDate().toString();
case "SECONDCOMMUNICATIONSENTDATE":
return wrapped.getSecondCommunicationSentDate().toString();
case "COMMENTS":
return wrapped.getComments().toString();
case "DETAILS":
return wrapped.getDetails().toString();
case "ID":
return wrapped.getId().toString();
case "CLASS":
return wrapped.getClass().toString();
}
return "";
}
@Override
public void setWrapped(BaseMobileDTO model)
{
this.wrapped = (MobileAuditHeaderDTO) model;
}
}
class MobileUserDTOModelAdaptor implements ModelAdaptor
{
private MobileUserDTO wrapped;
@Override
public String getProperty(String propertyName)
{
switch (propertyName.toUpperCase())
{
case "NAME":
return wrapped.getName().toString();
case "CODE":
return wrapped.getCode().toString();
case "ID":
return wrapped.getId().toString();
case "CLASS":
return wrapped.getClass().toString();
}
return "";
}
@Override
public void setWrapped(BaseMobileDTO model)
{
this.wrapped = (MobileUserDTO) model;
}
}
class MobileAuditHeaderCommentDTOModelAdaptor implements ModelAdaptor
{
private MobileAuditHeaderCommentDTO wrapped;
@Override
public String getProperty(String propertyName)
{
switch (propertyName.toUpperCase())
{
case "COMMENT":
return wrapped.getComment().toString();
case "ASSETAUDITHEADER":
return wrapped.getAssetAuditHeader().toString();
case "ID":
return wrapped.getId().toString();
case "CLASS":
return wrapped.getClass().toString();
}
return "";
}
@Override
public void setWrapped(BaseMobileDTO model)
{
this.wrapped = (MobileAuditHeaderCommentDTO) model;
}
}
public ModelAdaptor createAdaptor(BaseMobileDTO dto)
{
ModelAdaptor adaptor = null;
switch (dto.getClass().getSimpleName().toUpperCase())
{
case "MOBILEAUDITDETAILDTO":
adaptor = new MobileAuditDetailDTOModelAdaptor();
adaptor.setWrapped(dto);
break;
case "MOBILEAUDITHEADERDTO":
adaptor = new MobileAuditHeaderDTOModelAdaptor();
adaptor.setWrapped(dto);
break;
case "MOBILEUSERDTO":
adaptor = new MobileUserDTOModelAdaptor();
adaptor.setWrapped(dto);
break;
case "MOBILEAUDITHEADERCOMMENTDTO":
adaptor = new MobileAuditHeaderCommentDTOModelAdaptor();
adaptor.setWrapped(dto);
break;
}
return adaptor;
}
}
创建RebindResult类时,应该使用生成类的限定源名称,而不是接口的限定源名称 我期待这样的事情:
return new RebindResult(RebindMode.USE_ALL_NEW_WITH_NO_CACHING,
packageName + "." + generatedClassName);
其中generatedClassName是生成的类的名称
看起来您使用的是接口的名称。这不正确。GWT.create()需要传入您在.GWT.xml文件中配置的任何内容(在我的示例中,它应该查找ModelAdapterFactory)。generate()方法需要返回字符串,而不是重新绑定的结果。这取决于您如何实现生成器。使用“generateIncrementally”将返回重新绑定结果。在使用SDM的上下文中使用generate方法不是最好的主意。
package com.kn.tls.acsuk.mobile.generator;
import com.kn.tls.acsuk.mobile.generator.ModelAdaptor;
import com.kn.tls.acsuk.mobile.dto.BaseMobileDTO;
import com.kn.tls.acsuk.mobile.dto.MobileAuditDetailDTO;
import com.kn.tls.acsuk.mobile.dto.MobileAuditHeaderDTO;
import com.kn.tls.acsuk.mobile.dto.MobileUserDTO;
import com.kn.tls.acsuk.mobile.dto.MobileAuditHeaderCommentDTO;
public class ModelAdaptorFactoryImpl implements ModelAdaptorFactory {
class MobileAuditDetailDTOModelAdaptor implements ModelAdaptor
{
private MobileAuditDetailDTO wrapped;
@Override
public String getProperty(String propertyName)
{
switch (propertyName.toUpperCase())
{
case "TOTALASSETQUANTITY":
return wrapped.getTotalAssetQuantity().toString();
case "ONDISPLAYQUANTITY":
return wrapped.getOnDisplayQuantity().toString();
case "OFFSITEASSETQUANTITY":
return wrapped.getOffsiteAssetQuantity().toString();
case "OUTBOUNDTRANSITQUANTITY":
return wrapped.getOutboundTransitQuantity().toString();
case "INBOUNDTRANSITQUANTITY":
return wrapped.getInboundTransitQuantity().toString();
case "INACCESSIBLEASSETQUANTITY":
return wrapped.getInaccessibleAssetQuantity().toString();
case "DAMAGEDASSETQUANTITY":
return wrapped.getDamagedAssetQuantity().toString();
case "PACKEDASSETQUANTITY":
return wrapped.getPackedAssetQuantity().toString();
case "EMPTYASSETQUANTITY":
return wrapped.getEmptyAssetQuantity().toString();
case "ASSETAUDITHEADER":
return wrapped.getAssetAuditHeader().toString();
case "STOREFULLQUANTITY":
return wrapped.getStoreFullQuantity().toString();
case "STOREEMPTYQUANTITY":
return wrapped.getStoreEmptyQuantity().toString();
case "STOREOTHERQUANTITY":
return wrapped.getStoreOtherQuantity().toString();
case "EMPTYCLEANQUANTITY":
return wrapped.getEmptyCleanQuantity().toString();
case "EMPTYDIRTYQUANTITY":
return wrapped.getEmptyDirtyQuantity().toString();
case "ASSETTYPE":
return wrapped.getAssetType().toString();
case "ID":
return wrapped.getId().toString();
case "CLASS":
return wrapped.getClass().toString();
}
return "";
}
@Override
public void setWrapped(BaseMobileDTO model)
{
this.wrapped = (MobileAuditDetailDTO) model;
}
}
class MobileAuditHeaderDTOModelAdaptor implements ModelAdaptor
{
private MobileAuditHeaderDTO wrapped;
@Override
public String getProperty(String propertyName)
{
switch (propertyName.toUpperCase())
{
case "LOCATION":
return wrapped.getLocation().toString();
case "SCHEDULEDASSETAUDITDATE":
return wrapped.getScheduledAssetAuditDate().toString();
case "SCHEDULEDASSETAUDITOR":
return wrapped.getScheduledAssetAuditor().toString();
case "ACTUALASSETAUDITDATE":
return wrapped.getActualAssetAuditDate().toString();
case "ACTUALASSETAUDITOR":
return wrapped.getActualAssetAuditor().toString();
case "ASSETAUDITSTATUS":
return wrapped.getAssetAuditStatus().toString();
case "ASSETAUDITTYPE":
return wrapped.getAssetAuditType().toString();
case "FIRSTCOMMUNICATIONSENTDATE":
return wrapped.getFirstCommunicationSentDate().toString();
case "FINALCOMMUNICATIONSENTDATE":
return wrapped.getFinalCommunicationSentDate().toString();
case "SECONDCOMMUNICATIONSENTDATE":
return wrapped.getSecondCommunicationSentDate().toString();
case "COMMENTS":
return wrapped.getComments().toString();
case "DETAILS":
return wrapped.getDetails().toString();
case "ID":
return wrapped.getId().toString();
case "CLASS":
return wrapped.getClass().toString();
}
return "";
}
@Override
public void setWrapped(BaseMobileDTO model)
{
this.wrapped = (MobileAuditHeaderDTO) model;
}
}
class MobileUserDTOModelAdaptor implements ModelAdaptor
{
private MobileUserDTO wrapped;
@Override
public String getProperty(String propertyName)
{
switch (propertyName.toUpperCase())
{
case "NAME":
return wrapped.getName().toString();
case "CODE":
return wrapped.getCode().toString();
case "ID":
return wrapped.getId().toString();
case "CLASS":
return wrapped.getClass().toString();
}
return "";
}
@Override
public void setWrapped(BaseMobileDTO model)
{
this.wrapped = (MobileUserDTO) model;
}
}
class MobileAuditHeaderCommentDTOModelAdaptor implements ModelAdaptor
{
private MobileAuditHeaderCommentDTO wrapped;
@Override
public String getProperty(String propertyName)
{
switch (propertyName.toUpperCase())
{
case "COMMENT":
return wrapped.getComment().toString();
case "ASSETAUDITHEADER":
return wrapped.getAssetAuditHeader().toString();
case "ID":
return wrapped.getId().toString();
case "CLASS":
return wrapped.getClass().toString();
}
return "";
}
@Override
public void setWrapped(BaseMobileDTO model)
{
this.wrapped = (MobileAuditHeaderCommentDTO) model;
}
}
public ModelAdaptor createAdaptor(BaseMobileDTO dto)
{
ModelAdaptor adaptor = null;
switch (dto.getClass().getSimpleName().toUpperCase())
{
case "MOBILEAUDITDETAILDTO":
adaptor = new MobileAuditDetailDTOModelAdaptor();
adaptor.setWrapped(dto);
break;
case "MOBILEAUDITHEADERDTO":
adaptor = new MobileAuditHeaderDTOModelAdaptor();
adaptor.setWrapped(dto);
break;
case "MOBILEUSERDTO":
adaptor = new MobileUserDTOModelAdaptor();
adaptor.setWrapped(dto);
break;
case "MOBILEAUDITHEADERCOMMENTDTO":
adaptor = new MobileAuditHeaderCommentDTOModelAdaptor();
adaptor.setWrapped(dto);
break;
}
return adaptor;
}
}
return new RebindResult(RebindMode.USE_ALL_NEW_WITH_NO_CACHING,
packageName + "." + generatedClassName);