jersey/jackson/json + automatyzacja deserializacji

0

Witam
w kontrolerze mam taką metodę

[code]
@POST
@Path("/lista")
@Produces(MediaType.APPLICATION_JSON)
public String getList(

    	@DefaultValue("25") @FormParam("limit") int limit,    	 
    	@DefaultValue("1") @FormParam("page") int page,        	
    	@DefaultValue("0") @FormParam("start") int iStart,
    	@FormParam("sort") String sort ,
    	@FormParam("filter") String filter        	    	   

){
// kod
Dao dao = new DaoMyClass();
List<MyClass> d = dao.getList(sort, filter);
return Json.Create(d);
}
[/code]
zwraca w JSON opisane @JsonProperty właściwości

i ładnie działa, problem mam z parametrami typu niepierwotnego
np.
[code]
@PUT
public String addItem( MyClass mc) {}
[/code]
serwer wypluwa
415 Unsupported Media Type

w konfiguracji web.xml

    <init-param>
        <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name>
        <param-value>true</param-value>
    </init-param>

coś pominąłem?

0

Nie musisz robić żadnego Json.Create(d);. Jeżeli masz odpowiednią adnotację @Produces (możesz nią też adnotować całą klasę) to możesz zwrócić całą listę, a zostanie ona poprawnie zserializowana. Co do samego błędu natomiast, możesz spróbować adnotować metodę @Consumes(MediaType.APPLICATION_JSON), jeżeli to nie pomoże to pokaż proszę klasę MyClass.

0

celowo jest tam Json.Create() - potrzebowałem większej kontroli na zwracanym jsonem (np. nie wiedziałem gdzie globalnie ustawić domyślny format zwracania daty

[code]
@XmlRootElement
@Entity
@Table(name = "KOSZT_NAG")
public class KosztNag implements java.io.Serializable {

@JsonIgnore
private static final long serialVersionUID = -344628823935034731L;

public KosztNag() {}

@JsonProperty
@Column
@Id
public float koszt_id;
 
@JsonProperty
@Column
@Basic(optional = false)	
@Type(type = "xxx.HiberTrimChar")
public String dok_typ;
 
@JsonProperty
@Column	
public String rach_nr;
 
@JsonProperty
@Column
public Date data_wyst;

}
[/code]

0

Wygląda OK. Na szybko skopiowałem do siebie, usunąłem adnotacje JPA, dodałem testowy resource i działa jak należy. Jackson nie rzuca jakimś dokładniejszym błędem na konsolę?

Co do konfiguracji JSONa preferowaną metodą jest odpowiednie skonfigurowanie ObjectMappera. Możesz go konfigurować tworząc mniej więcej taką klasę:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;

@Provider
public class ObjectMapperProvider implements ContextResolver<ObjectMapper> {

    private final ObjectMapper mapper;

    public ObjectMapperProvider() {
        mapper = new ObjectMapper();
        mapper.enable(SerializationFeature.INDENT_OUTPUT);
    }

    @Override
    public ObjectMapper getContext(Class<?> type) {
        return mapper;
    }
}

0

konsola:
[code]
com.sun.jersey.spi.container.ContainerRequest getEntity
SEVERE: A message body reader for Java class xxx.entity.KosztNag, and Java type class xxx.entity.KosztNag, and MIME media type application/json; charset=UTF-8 was not found.
The registered message body readers compatible with the MIME media type are:
application/json; charset=UTF-8 ->
com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$App
com.sun.jersey.json.impl.provider.entity.JSONArrayProvider$App
com.sun.jersey.json.impl.provider.entity.JSONObjectProvider$App
com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$App
com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$App
/ ->
com.sun.jersey.core.impl.provider.entity.FormProvider
com.sun.jersey.core.impl.provider.entity.MimeMultipartProvider
com.sun.jersey.core.impl.provider.entity.StringProvider
com.sun.jersey.core.impl.provider.entity.ByteArrayProvider
com.sun.jersey.core.impl.provider.entity.FileProvider
com.sun.jersey.core.impl.provider.entity.InputStreamProvider
com.sun.jersey.core.impl.provider.entity.DataSourceProvider
com.sun.jersey.core.impl.provider.entity.XMLJAXBElementProvider$General
com.sun.jersey.core.impl.provider.entity.ReaderProvider
com.sun.jersey.core.impl.provider.entity.DocumentProvider
com.sun.jersey.core.impl.provider.entity.SourceProvider$StreamSourceReader
com.sun.jersey.core.impl.provider.entity.SourceProvider$SAXSourceReader
com.sun.jersey.core.impl.provider.entity.SourceProvider$DOMSourceReader
com.sun.jersey.json.impl.provider.entity.JSONJAXBElementProvider$General
com.sun.jersey.json.impl.provider.entity.JSONArrayProvider$General
com.sun.jersey.json.impl.provider.entity.JSONObjectProvider$General
com.sun.jersey.core.impl.provider.entity.XMLRootElementProvider$General
com.sun.jersey.core.impl.provider.entity.XMLListElementProvider$General
com.sun.jersey.core.impl.provider.entity.XMLRootObjectProvider$General
com.sun.jersey.core.impl.provider.entity.EntityHolderReader
com.sun.jersey.json.impl.provider.entity.JSONRootElementProvider$General
com.sun.jersey.json.impl.provider.entity.JSONListElementProvider$General

[/code]

0

Wygląda jak by brakowało kawałka Jacksona odpowiedzialnego za współpracę z Jersey. Jeżeli korzystasz z Jacksona 1.x to zdaje się że chodzi o jax-rs do pobrania stąd, jeżeli z wersji 2.x to musisz pobrać jackson-jaxrs-json-provider

0

Ruszyłem temat ObjectMappera, klasa istnieje i mimo wpisu w web.xml nie jest używana do serializacji/deserializacji (testowałem tez na twoim kodzie OM podanym wcześniej)
[code]
<init-param>
<param-name>com.sun.jersey.config.property.classnames</param-name>
<param-value>pl.test.json.ObjectMapperProvider</param-value>
</init-param>
[/code]
coś jeszcze ustawić?

korekta
[code]
<param-name>com.sun.jersey.config.property.packages</param-name>
[/code]

jest ok

1 użytkowników online, w tym zalogowanych: 0, gości: 1