2

我想創建一對Endpoint控制器類(使用Objectify),並且由於它們共享大量通用代碼,因此請使用一些通用基類。 我覺得做這樣的:如何構建(通用)端點控制器類(層級)

@Api(
    backendRoot = "http://localhost:8888/_ah/spi", 
    root = "http://localhost:8888/_ah/api", 
    version = "v1" 
) 
abstract class BaseController[T <: Entity[T]] { 

    protected def getApiClass() : Class[T] 

    @ApiMethod(
    name = "read", 
    path = "read", 
    httpMethod = HttpMethod.GET 
) 
    def read() : JList[T] = { 
    OfyS.ofy().load().`type`(getApiClass()).list().asInstanceOf[JList[T]] 
    } 

    def create(entity : T) : T = { 
    … 
    } 
… 
} 

@Api(
    name = "misc" 
) 
class MiscController extends BaseController[Misc] { 
    override protected def getApiClass() = classOf[Misc] 
} 

幾種實現方式之一。這樣,我基本上只需要在每個實現中替換類型和API名稱(這是基本思想)。

唉,端點試圖揭露getApiClass()的API和我

java.lang.IllegalArgumentException: Parameterized type java.lang.Class<Misc> not supported 

(據我所知,我不能省略類型參數在這裏。)

這種情況雖然方法是受保護文件指出只有公開的方法纔會暴露。這可能是因爲斯卡拉的'受保護'味道(我根本不知道)。如果它是私有的(如果我沒有使用類層次結構,基本上可以工作),我無法覆蓋它。

對於如何使基本思想起作用,你有任何線索嗎?

回答

0

好問題!下面是如何解決這個問題?

我的每端點 S的這個樣子:

警告:這不是產品代碼! (尤其是,請注意我不使用光標,因爲我遇到不同的問題,我無法使用它)。現在

public class MyEndpoint { 
@ApiMethod(
    name = "get", 
    path = "bean/{id}", 
    httpMethod = ApiMethod.HttpMethod.GET) 
public Bean get(@Named("id") Long id) throws NotFoundException { 
    return new MyService().get(id); 
    } 
    ... 
} 

,讓我們看看爲MyService類:

public class MyService extends AbstractService<Long, Bean> { 
    static { 
     ObjectifyService.register(Bean.class); 
    } 
    public MyService() { 
     super(Long.class, Bean.class); 
    } 
} 

最後,AbstractService

public class AbstractService<D, T> { 
     protected static final Logger logger = Logger.getLogger(AbstractService.class.getName()); 
     private final Class<?> idClazz; 
     private final Class<? extends T> clazz; 
     public AbstractService(Class<?> idClazz, Class<? extends T> clazz) { 
      this.idClazz = idClazz; 
      this.clazz = clazz; 
     } 

public T get(D id) throws NotFoundException { 
      logger.info("Getting " + clazz.getName() + " with ID: " + id); 
      T obj = null; 
      if (idClazz == Long.class) { 
       Long parsedId = (Long) id; 
       obj = ofy().load().type(clazz).id(parsedId).now(); 
      } else if (idClazz == String.class) { 
       String parsedId = (String) id; 
       obj = ofy().load().type(clazz).id(parsedId).now(); 
      } 
      if (obj == null) { 
       throw new NotFoundException("Could not find " + getClass().getName() + " with ID: " + id); 
      } 
      return obj; 
     } 

     public T insert(T obj) { 
      ofy().save().entity(obj).now(); 
      logger.info("Created " + clazz.getName() + "."); 
      return ofy().load().entity(obj).now(); 
     } 

     public T update(D id, T obj) throws NotFoundException { 
      checkExists(id); 
      ofy().save().entity(obj).now(); 
      logger.info("Updated " + clazz.getName() + ": " + obj); 
      return ofy().load().entity(obj).now(); 
     } 

     public void remove(D id) throws NotFoundException { 
      checkExists(id); 
      T obj = null; 
      if (idClazz == Long.class) { 
       Long parsedId = (Long) id; 
       ofy().delete().type(clazz).id(parsedId).now(); 
      } else if (idClazz == String.class) { 
       String parsedId = (String) id; 
       ofy().delete().type(clazz).id(parsedId).now(); 
      } 
      logger.info("Deleted " + getClass().getName() + " with ID: " + id); 
     } 

     public CollectionResponse<T> list() { 
      //  limit = limit == null ? DEFAULT_LIST_LIMIT : limit; 
      logger.info("Listing " + clazz.getName() + "s"); 
      Query<? extends T> query = ofy().load().type(clazz); 
      QueryResultIterator<? extends T> queryIterator = query.iterator(); 
      List<T> objList = new ArrayList<T>(); 
      while (queryIterator.hasNext()) { 
       objList.add(queryIterator.next()); 
      } 
      return CollectionResponse.<T>builder().setItems(objList).build(); 
     } 

     public CollectionResponse<T> list(int limit, int startAt) { 
      logger.info("Listing " + clazz.getName() + "s"); 
      Query<? extends T> query = ofy().load().type(clazz).offset(startAt).limit(limit); 
      QueryResultIterator<? extends T> queryIterator = query.iterator(); 
      List<T> objList = new ArrayList<T>(); 
      while (queryIterator.hasNext()) { 
       objList.add(queryIterator.next()); 
      } 
      return CollectionResponse.<T>builder().setItems(objList).build(); 
     } 

     private void checkExists(D id) throws NotFoundException { 
      try { 
       if (idClazz == Long.class) { 
        Long parsedId = (Long) id; 
        ofy().load().type(clazz).id(parsedId).safe(); 
       } else if (idClazz == String.class) { 
        String parsedId = (String) id; 
        ofy().load().type(clazz).id(parsedId).safe(); 
       } 
      } catch (com.googlecode.objectify.NotFoundException e) { 
       throw new NotFoundException("Could not find " + getClass().getName() + " with ID: " + id); 
      } 
     } 
    } 
+0

當然!我怎麼會盲目忘記構造函數呢..謝謝! – user462982 2014-12-05 15:35:01

相關問題