Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/gwt/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 除前缀或如何使用PlaceHistoryMapperWithFactory外共享所有内容的位置_Java_Gwt - Fatal编程技术网

Java 除前缀或如何使用PlaceHistoryMapperWithFactory外共享所有内容的位置

Java 除前缀或如何使用PlaceHistoryMapperWithFactory外共享所有内容的位置,java,gwt,Java,Gwt,在我的gwt应用程序中,我有一些地方共享前缀以外的所有内容(如“editUserPlace”和“showUserPlace”-在本例中,状态由用户ID确定) 我当前的尝试是通过“ShowUserPlace”和“EditUserPlace”扩展抽象的“UserPlace”。它们仅在一行中有所不同:@Prefix(“showUser”)/@Prefix(“editUser”)-必须复制孔标记器代码(我不能继承标记器代码,但会覆盖前缀) 年,托马斯建议使用“PlaceHistoryMapperWith

在我的gwt应用程序中,我有一些地方共享前缀以外的所有内容(如“editUserPlace”和“showUserPlace”-在本例中,状态由用户ID确定) 我当前的尝试是通过“ShowUserPlace”和“EditUserPlace”扩展抽象的“UserPlace”。它们仅在一行中有所不同:@Prefix(“showUser”)/@Prefix(“editUser”)-必须复制孔标记器代码(我不能继承标记器代码,但会覆盖前缀)

年,托马斯建议使用“PlaceHistoryMapperWithFactory”,但我坚持使用它

我是否必须为每个位置/标记器提供一种方法(也适用于“正常”的位置-提供自己的标记器)? 我是否必须将我的抽象和/或扩展类广告到@WithTokenizer? 我应该如何/在哪里给setFactory打电话

是否有人使用PlaceHistoryMapperWithFactory(可能在类似的用例中)?给我一些建议? 是否有人面对同样的问题并以另一种方式解决了它?

该工厂应该:

类MyFactory{
@前缀(“showUser”)
public PlaceTokenizer showUserPlace(){
返回新的UserPlaceTokenizer(){
受保护的ShowUserPlace createPlace(字符串id){
返回新的ShowUserPlace(id);
}
};
}
@前缀(“showUser”)
public PlaceTokenizer showUserPlace(){
返回新的UserPlaceTokenizer(){
受保护的EditUserPlace createPlace(字符串id){
返回新的EditUserPlace(id);
}
};
}
}
抽象类UserPlaceTokenizer实现PlaceTokenizer

{ 公共P getPlace(字符串令牌){ //两个位置之间的共享逻辑:从令牌解析ID(或任何内容) 返回创建地点(id); } 公共字符串getToken(P位置){ //两个位置之间的共享逻辑:构建令牌不合适 返回令牌; } 受保护的抽象P createPlace(字符串id); }

当然,您也可以在标记器中插入某种
提供者
,而不是将其子类化以覆盖其
createPlace
方法

您可以将它与
@WithTokenizers
一起使用,如果生成器为完全相同的位置或前缀找到两个Tokenizer,它将阻塞


您应该在
GWT.create()
映射器之后调用
setFactory
(实际上,重要的是在调用映射器的
getPlace
getToken
方法之前设置工厂)。

好吧,我摆弄了一个通用标记器(“UserPlaceTokenizer”)但是放弃了:问题是工厂需要一个具体类的标记器,所以首先我尝试制作一个通用标记器:

    public static class  Tokenizer<T extends UserPlace> implements PlaceTokenizer<T> {

    @Override
    public final T getPlace(final String token) {
        return (T) new UserPlace(token); //BAD
    }

    @Override
    public final String getToken(final T place) {
        return place.getToken();
    }
}
公共静态类标记器实现PlaceTokenizer{
@凌驾
公共最终T getPlace(最终字符串标记){
返回(T)新用户位置(令牌);//错误
}
@凌驾
公共最终字符串getToken(最终T位){
return place.getToken();
}
}
问题是将UserPlace转换为(T)-这不会起作用(UserPlace不能转换为具体的子类)。因此,我需要一个“returnnewshowuserplace(…)”来获取这个实例,以满足标记器接口。 为了使o long story不会太长:我回到我以前的解决方案:扩展类复制超类的构造函数,并提供单独的标记化器,这些标记化器只调用自己的构造函数(调用超级构造函数):

公共类ShowUserPlace扩展了UserPlace{
公共ShowUserPlace(字符串令牌){
超级(代币);
}
@前缀(value=“showUser”)
公共静态类标记器实现PlaceTokenizer{
@凌驾
公共最终ShowUserPlace getPlace(最终字符串标记){
返回新的ShowUserPlace(令牌);
}
@凌驾
公共最终字符串getToken(最终ShowUserPlace){
return place.getToken();
}
}
}
临时解决方案是提供接口方法的抽象标记器。getPlace将调用一个抽象方法(返回T),具体实现将调用具体构造函数(也只调用超级构造函数)。最后,此解决方案的行数和复制的代码数与上面的解决方案大致相同:-|


对此我仍然有一种不好的感觉-可能他们的解决方案仍然是“.WithFactory”或一种完全不同的方式来面对这种用例。

thx以获得澄清。因为我使用了杜松子酒-如何/在哪里调用setFactory?可能是在ModuleLoad上(它位于“private final ClientInjector=GWT.create(ClientInjector.class);”之后)?您是否可能复制粘贴失败?我猜前缀和方法名应该是不同的?!我遇到了一个小问题:如何实现UserPlaceTokenizer?它应该同时实现这两种类型(PlaceTokenizer和…),还是可以是通用的placeTokenizer更新的答案(您必须为
getPlace
提供特定于地点的代码,正如您自己所想)。至于GIN,您可以自己在提供者(或提供者方法)中执行
GWT.create()
+
setFactory
;或者简单地覆盖映射器界面中的
setFactory
,并用
@Inject
对其进行注释(GIN应该在它
GWT.create()
s接口之后调用它)。thx您在我的回答结束时提出了我的建议:需要一个抽象标记器。代码的不同之处在于具体实现是匿名的——我将它们放在place类中。我认为你的建议少了一点抄袭的内容:-)。因此,thx再次-acceptedi使其工作,但在托管模式下失败,请参见此处:
    public static class  Tokenizer<T extends UserPlace> implements PlaceTokenizer<T> {

    @Override
    public final T getPlace(final String token) {
        return (T) new UserPlace(token); //BAD
    }

    @Override
    public final String getToken(final T place) {
        return place.getToken();
    }
}
public class ShowUserPlace extends UserPlace {

public ShowUserPlace(String token) {
    super(token);
}

@Prefix(value = "showUser")
public static class Tokenizer implements PlaceTokenizer<ShowUserPlace> {

    @Override
    public final ShowUserPlace getPlace(final String token) {
        return new ShowUserPlace(token);
    }

    @Override
    public final String getToken(final ShowUserPlace place) {
        return place.getToken();
    }
}
}