2013-09-18 1 views
3

Я создал свой собственный PackagesResourceConfig, который выглядит следующим образом:Почему Джерси говорит: «Массив пакетов не должен быть пустым или пустым», когда я создаю свой собственный PackagesResourceConfig?

import com.sun.jersey.api.core.PackagesResourceConfig; 

import javax.ws.rs.core.MediaType; 
import java.util.HashMap; 
import java.util.Map; 

public class ResourceConfigClass extends PackagesResourceConfig { 
    @Override 
    public Map<String, MediaType> getMediaTypeMappings() { 
     Map<String, MediaType> map = new HashMap<String, MediaType>(); 
     map.put("xml", MediaType.APPLICATION_XML_TYPE); 
     map.put("json", MediaType.APPLICATION_JSON_TYPE); 
     return map; 
    } 
} 

Но теперь, когда я начинаю мое приложение, он дает мне ошибку, которая говорит:

Массив пакетов не должен быть нулевым или пустым

Это происходит из этого исходного кода в Джерси:

/** 
* Search for root resource classes declaring the packages as an 
* array of package names. 
* 
* @param packages the array package names. 
*/ 
public PackagesResourceConfig(String... packages) { 
    if (packages == null || packages.length == 0) 
     throw new IllegalArgumentException("Array of packages must not be null or empty"); 

    init(packages.clone()); 
} 

Но я уже установил пакеты в свой web.xml, установив параметр com.sun.jersey.config.property.packages, чтобы он не был пустым.

ответ

2

Это на самом деле проблема Java. В отличие от обычных конструкторов с параметрами, если конструктор имеет только varargs, он не имеет права ничего пропускать. В результате у вас нет , чтобы переопределить конструктор, как если бы он принял String или Integer или любой параметр, отличный от vararg. Изменение моего класса к этому устранило проблему:

import com.sun.jersey.api.core.PackagesResourceConfig; 

import javax.ws.rs.core.MediaType; 
import java.util.HashMap; 
import java.util.Map; 

public class ResourceConfigClass extends PackagesResourceConfig { 
    public ResourceConfigClass(String... packages) { //this constructor needs to be here, do not delete it or else the com.sun.jersey.config.property.packages param can't be passed in. 
     super(packages); 
    } 

    public ResourceConfigClass(Map<String, Object> props) { //this constructor needs to be here, do not delete it or else the com.sun.jersey.config.property.packages param can't be passed in. 
     super(props); 
    } 

    @Override 
    public Map<String, MediaType> getMediaTypeMappings() { 
     Map<String, MediaType> map = new HashMap<String, MediaType>(); 
     map.put("xml", MediaType.APPLICATION_XML_TYPE); 
     map.put("json", MediaType.APPLICATION_JSON_TYPE); 
     return map; 
    } 
} 
+0

Я никогда не был в этой ситуации раньше, хорошо знаю. –

+0

@SotiriosDelimanolis же! Это никогда не затрагивало меня раньше –

Смежные вопросы