2017-02-14 4 views
0

私は、いくつかのjaxrsアノテーションを複製せずにジェネリック抽象ジャンクションサービスを実装するのに苦労しています。ジェネリック抽象ジャンクションサービスを実装する

したがって、たとえば、ここに私のサービスと実体構造は次のとおりです。

AbstractEntity.java

import javax.xml.bind.annotation.XmlElement; 

public abstract class AbstractEntity { 
    @XmlElement 
    private String name; 

    public String getName() { 
     return name; 
    } 
} 

AbstractService.java

import javax.ws.rs.Consumes; 
import javax.ws.rs.POST; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.Response; 

public class AbstractService<T extends AbstractEntity> { 
    @POST 
    @Consumes(MediaType.APPLICATION_XML) 
    @Produces(MediaType.TEXT_PLAIN) 
    @Path("/details") 
    public Response getEntityDetails(final T entity) { 
     // just return the name of this entity 
     return Response.ok(entity.getName()).build(); 
    } 
} 

実装は次のようです:

Car.java

import javax.xml.bind.annotation.XmlElement; 
import javax.xml.bind.annotation.XmlRootElement; 

@XmlRootElement 
public class Car extends AbstractEntity { 
    @XmlElement 
    private String brand; 

    public String getBrand() { 
     return brand; 
    } 
} 

CarService.java

import javax.ws.rs.Path; 

@Path("/cars") 
public class CarService extends AbstractService<Car> { 
    // should provide the super getEntityDetails method with a Car entity 
} 

今私は(詳細を取得する/cars/detailsに私の車のエンティティを投稿したい実装されている名前 "A5" を返します抽象サービスで):

POST /cars/details 
<car> 
    <brand>Audi</brand> 
    <name>A5</name> 
</car> 

残念ながら、私は私のサービスに投稿するとき、それは言う:

JAXRSUtils W .No message body reader found for request class : AbstractEntity, ContentType : application/xml. 
WebApplicatio W WebApplicationException has been caught : no cause is available 

次のように私は私のCarServiceを実装する場合、私は、それを修正することができます。

CarService.java

import javax.ws.rs.Consumes; 
import javax.ws.rs.POST; 
import javax.ws.rs.Path; 
import javax.ws.rs.Produces; 
import javax.ws.rs.core.MediaType; 
import javax.ws.rs.core.Response; 

@Path("/cars") 
public class CarService extends AbstractService<Car> { 
    @POST 
    @Consumes(MediaType.APPLICATION_XML) 
    @Produces(MediaType.TEXT_PLAIN) 
    @Path("/details") 
    @Override 
    public Response getEntityDetails(final Car entity) { 
     return super.getEntityDetails(entity); 
    } 
} 

そして、すべて削除します抽象サービスからのjaxrs注釈:

AbstractService.java

import javax.ws.rs.core.Response; 

public class AbstractService<T extends AbstractEntity> { 
    public Response getEntityDetails(final T entity) { 
     // just return the name of this entity 
     return Response.ok(entity.getName()).build(); 
    } 
} 

ポイントは、それが常に同じ(同じ定型なので、私はこれらのCarService実装の約60持っていると私はそれが各サービスにおけるjaxrs注釈のすべてとgetDetails方法を繰り返したくないということであり、 )。

これに関するアイデアや解決策はありますか?

答えて

0

あなたのJAX-RSコードベースを補完するために、よりリソース指向のレストライブラリを見たい場合があります。彼らは注釈や抽象基本クラス地獄なしで正確に(パスのマッピング、ソート、フィルタリング、ページングなど)行うことができます。 crnk.io + jsonapi、graphql、falcorはそのようなライブラリです。 (免責事項:私は最初のものに貢献する)

関連する問題