Jersey 2.6@QueryParam在使用MOXY时在@BeanParam中丢失,但在Jackson中没有

Jersey 2.6@QueryParam在使用MOXY时在@BeanParam中丢失,但在Jackson中没有,moxy,jersey-2.0,Moxy,Jersey 2.0,我正在为我的公司开发一套RESTWeb服务。我们正试图确定我们想要使用什么技术。 当我使用Jackson JSON提供程序时,我有一个与JAX-RS Jersey 2.6一起工作的模板web服务,但当我使用Moxy提供程序时,似乎无法正确封送@QueryParam 搜索可能包括多个“类型”,如类型=关键字&类型=产品编号&类型=fubar 这些被映射到包含所有“type”QueryParam的列表类型。当我使用Jackson构建项目时,类型的值被正确地收集到列表中,当我使用MOXy时,列表为空。

我正在为我的公司开发一套RESTWeb服务。我们正试图确定我们想要使用什么技术。 当我使用Jackson JSON提供程序时,我有一个与JAX-RS Jersey 2.6一起工作的模板web服务,但当我使用Moxy提供程序时,似乎无法正确封送@QueryParam

搜索可能包括多个“类型”,如类型=关键字&类型=产品编号&类型=fubar 这些被映射到包含所有“type”QueryParam的列表类型。当我使用Jackson构建项目时,类型的值被正确地收集到列表中,当我使用MOXy时,列表为空。MOXy确实映射BeanParam中的所有其他查询和路径参数

问题似乎在于泽西的风格 当我使用Jackson时,服务效果非常好:

http://XXX:8080/SearchTermJersey/search/1/as/wat?type=product_number&type=keyword&count=4&lang=en_US
这是它返回的JSON:

{"autoSuggestions":{"product_number":{"<span>wat</span>21000":34},"keyword":{"<span>wat</span>er":100,"<span>wat</span>er solution":50,"<span>wat</span>er purity":100}},"language":"en_US","requestDate":1393623225135,"responseDate":1393623225135,"term":"wat","version":"1"}
MOXy和Jackson版本之间的Java代码是相同的 这是BeanParam:

public class AutoSuggestParam {
@PathParam("version")
private String version;

@PathParam("term")
private String term;

private List<String>types;

private Integer count;

String language;

public AutoSuggestParam(@QueryParam("count")int count, @QueryParam("type")List<String>types, @QueryParam("lang")String language) {
    this.types = types;
    this.count = count;
    this.language = language;
}
public String getVersion() {
    return version;
}

public void setVersion(String version) {
    this.version = version;
}

public String getTerm() {
    return term;
}

public void setTerm(String term) {
    this.term = term;
}


public Integer getCount() {
    return count;
}


public String getLanguage() {
    return language;
}

public List<String>getTypes() {
    return types != null ? types : new ArrayList<String>();
}
公共类AutoSuggestParam{
@PathParam(“版本”)
私有字符串版本;
@PathParam(“术语”)
私有字符串术语;
私有列表类型;
私有整数计数;
字符串语言;
公共AutoSuggestParam(@QueryParam(“count”)int count、@QueryParam(“type”)Listtypes、@QueryParam(“lang”)字符串语言){
this.types=类型;
this.count=计数;
这种语言=语言;
}
公共字符串getVersion(){
返回版本;
}
公共void setVersion(字符串版本){
this.version=版本;
}
公共字符串getTerm(){
回报期;
}
公共void setTerm(字符串术语){
这个术语=术语;
}
公共整数getCount(){
返回计数;
}
公共字符串getLanguage(){
返回语言;
}
公共ListgetTypes(){
返回类型!=null?类型:new ArrayList();
}
问题似乎在于如何处理types参数。使用Jackson时,类型QueryParams被正确编组到列表中,但MOXy失败并仅返回null。因此getTypes返回的是空列表。简单的QueryParam计数和lang被正确处理。这是Jersey中的一个错误,还是我需要使用MOXy执行其他操作?

这是我的资源类:

@javax.ws.rs.Path("/search/{version}/as/{term}")
public class AutoSuggestResource {
@GET
@Produces(MediaType.APPLICATION_JSON)
public AutoSuggestResponse getAutoSuggest(@BeanParam AutoSuggestParam autoSuggestParam) {
    System.out.printf("Request: term=%s version=%s lang=%s type=%s count=%d%n", 
            autoSuggestParam.getTerm(),autoSuggestParam.getVersion(), autoSuggestParam.getLanguage(), autoSuggestParam.getTypes().get(0), autoSuggestParam.getCount());
    return search(autoSuggestParam);
}



private AutoSuggestResponse search(AutoSuggestParam autoSuggestParam) {
    AutoSuggestResponse autoSuggestResponse = new AutoSuggestResponse();
    autoSuggestResponse.setRequestDate(new Date().getTime());
    autoSuggestResponse.setVersion(autoSuggestParam.getVersion());
    autoSuggestResponse.setTerm(autoSuggestParam.getTerm());
    autoSuggestResponse.setLanguage(autoSuggestParam.getLanguage());
    int cnt = 0;
    for (String type : autoSuggestParam.getTypes()) {
        if ("product_number".equals(type)) {
            Map<String, Object> values = autoSuggestResponse.getAutoSuggestions().get(type);
            if (values == null) {
                values = new LinkedHashMap<String, Object>();
                autoSuggestResponse.getAutoSuggestions().put(type, values);
            }
            String key = String.format("<span>%s</span>21000", autoSuggestParam.getTerm());
            values.put(key, 34);
            cnt++;
        }
        else if ("keyword".equals(type)) {
            Map<String, Object> values = autoSuggestResponse.getAutoSuggestions().get(type);
            if (values == null) {
                values = new LinkedHashMap<String, Object>();
                autoSuggestResponse.getAutoSuggestions().put(type, values);
            }
            String key = String.format("<span>%s</span>er", autoSuggestParam.getTerm());
            values.put(key, 100);
            cnt++;
            key = String.format("<span>%s</span>er solution", autoSuggestParam.getTerm());
            values.put(key, 50);
            cnt++;
            key = String.format("<span>%s</span>er purity", autoSuggestParam.getTerm());
            values.put(key, 100);
            cnt++;

        }
        if (cnt >= autoSuggestParam.getCount()) {
            break;
        }
    }
    autoSuggestResponse.setResponseDate(new Date().getTime());
    return autoSuggestResponse;
}
@javax.ws.rs.Path(“/search/{version}/as/{term}”)
公共类自动建议资源{
@得到
@产生(MediaType.APPLICATION_JSON)
公共AutoSuggestResponse getAutoSuggest(@BeanParam AutoSuggestParam AutoSuggestParam){
System.out.printf(“请求:术语=%s版本=%s语言=%s类型=%s计数=%d%n”,
autoSuggestParam.getTerm()、autoSuggestParam.getVersion()、autoSuggestParam.getLanguage()、autoSuggestParam.getTypes().get(0)、autoSuggestParam.getCount();
返回搜索(autoSuggestParam);
}
专用AutoSuggestResponse搜索(AutoSuggestParam AutoSuggestParam){
AutoSuggestResponse AutoSuggestResponse=新的AutoSuggestResponse();
autoSuggestResponse.setRequestDate(新日期().getTime());
autoSuggestResponse.setVersion(autoSuggestParam.getVersion());
autoSuggestResponse.setTerm(autoSuggestParam.getTerm());
autoSuggestResponse.setLanguage(autoSuggestParam.getLanguage());
int-cnt=0;
for(字符串类型:autoSuggestParam.getTypes()){
if(“产品编号”。等于(类型)){
映射值=autoSuggestResponse.getAutoSuggestions().get(类型);
如果(值==null){
values=newlinkedhashmap();
autoSuggestResponse.getAutoSuggestions().put(类型、值);
}
String key=String.format(“%s21000”,autoSuggestParam.getTerm());
价值观。付诸表决(键,34);
cnt++;
}
else if(“关键字”。等于(类型)){
映射值=autoSuggestResponse.getAutoSuggestions().get(类型);
如果(值==null){
values=newlinkedhashmap();
autoSuggestResponse.getAutoSuggestions().put(类型、值);
}
String key=String.format(“%ser”,autoSuggestParam.getTerm());
值。put(键,100);
cnt++;
key=String.format(“%ser solution”,autoSuggestParam.getTerm());
值。put(键,50);
cnt++;
key=String.format(“%ser”,autoSuggestParam.getTerm());
值。put(键,100);
cnt++;
}
如果(cnt>=autoSuggestParam.getCount()){
打破
}
}
autoSuggestResponse.setResponseDate(新日期().getTime());
返回自动建议响应;
}
响应类:

public class AutoSuggestResponse {
private Long requestDate;
private Long responseDate;
private String version;
private String term;
private String language;

private Map<String, Map<String,Object>>autoSuggestions = new LinkedHashMap<String, Map<String,Object>>();

public Long getRequestDate() {
    return requestDate;
}
public void setRequestDate(Long requestDate ) {
    this.requestDate = requestDate;
}
public Long getResponseDate() {
    return responseDate;
}
public void setResponseDate(Long responseDate) {
    this.responseDate = responseDate;
}
public String getVersion() {
    return version;
}
public void setVersion(String version) {
    this.version = version;
}
public String getTerm() {
    return term;
}
public void setLanguage(String language) {
    this.language = language;
}
public String getLanguage() {
    return language;
}
public void setTerm(String term) {
    this.term = term;
}
public Map<String, Map<String,Object>>getAutoSuggestions() {
    return autoSuggestions;
}
公共类自动建议响应{
私人长时间约会;
私人长响应;
私有字符串版本;
私有字符串术语;
私有字符串语言;
private MapautoSuggestions=新建LinkedHashMap();
公共长getRequestDate(){
返回请求日期;
}
公共无效setRequestDate(长requestDate){
this.requestDate=requestDate;
}
公共长期响应(){
返回应答;
}
公共无效设置响应日期(长响应日期){
this.responseDate=responseDate;
}
公共字符串getVersion(){
返回版本;
}
公共void setVersion(字符串版本){
this.version=版本;
}
公共字符串getTerm(){
回报期;
}
公共语言(字符串语言){
这种语言=语言;
}
公共字符串getLanguage(){
返回语言;
}
公共void setTerm(字符串术语){
这个术语=术语;
}
公共MapgetAutoSuggestions(){
返回自动建议;
}
}

web.xml

      <display-name>MoxyAS</display-name>
<servlet>
<servlet-name>MoxyAutoSuggest</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
  <param-name>jersey.config.server.provider.packages</param-name>
  <param-value>com.sial.search.ws</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
MoxyAS
烟雾自动暗示
org.glassfish.jersey.servlet.ServletContainer
jersey.config.server.provider.packages
com.sial.search.ws
1.


烟雾自动暗示
/*
默认情况下,不会封送只有getter的属性。您可以添加
@xmlement
注释以将其映射为:

@xmlement
公共MapgetAutoSuggestions(){
返回自动建议;
}
默认情况下,MOXy不使用map键作为JSON键
      <display-name>MoxyAS</display-name>
<servlet>
<servlet-name>MoxyAutoSuggest</servlet-name>
<servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
<init-param>
  <param-name>jersey.config.server.provider.packages</param-name>
  <param-value>com.sial.search.ws</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
  <servlet-mapping>
<servlet-name>MoxyAutoSuggest</servlet-name>
<url-pattern>/*</url-pattern>
 </servlet-mapping>
</web-app>