RESTful-service in der Spring-Konfiguration mit jackson-datatype-jsr310

Ich versuche zur Konfiguration eines Java-8 & Frühling 4.3.1 app zur Verwendung von RESTful services. Ich bekomme es funktioniert perfekt mit der config unten, bis ich Ihnen eine ContextResolver.

Den Grund für die ContextResolver ist, weil ich muss formatieren java.time.LocalDateTime zu JSON.

Zuerst habe ich versucht mit Anmerkungen auf mein model-bean, indem die @JsonFormat,

@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = DATE_FORMAT)    
@DateTimeFormat(pattern=DATE_FORMAT) 
@Column(name = "JOINING_DATE", nullable = false)
@Type(type="org.hibernate.type.LocalDateTimeType")
private LocalDateTime joiningDate;

- und bekam die folgende Fehler:

java.lang.NoSuchMethodError:
com.fasterxml.jackson.datatype.jsr310.ser.JSR310FormattedSerializerBase.findFormatOverrides(Lcom/fasterxml/jackson/databind/SerializerProvider;Lcom/fasterxml/jackson/databind/BeanProperty;Ljava/lang/Class;)Lcom/fasterxml/jackson/annotation/JsonFormat$Value;

Zweitens entfernte ich die @JsonFormat annotation und versuchte mit einem ContextResolver,

ObjectMapperContextResolver.java

package com.jobs.spring.configuration;

import javax.ws.rs.ext.ContextResolver;
import javax.ws.rs.ext.Provider;

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;

@Provider
public class ObjectMapperContextResolver implements ContextResolver<ObjectMapper> {  
    private final ObjectMapper MAPPER;

    public ObjectMapperContextResolver() {
        MAPPER = new ObjectMapper();
        MAPPER.registerModule(new JavaTimeModule());
        MAPPER.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
    }

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

- und bekam die folgende Fehler:

[org.springframework.web.- servlet.PageNotFound] (default-task-4) Nr.
mapping gefunden für den HTTP-request mit dem URI [/jbosswildfly/Mitarbeiter/list]
in DispatcherServlet mit dem Namen 'rest'

Bitte kann jemand raten, ich glaube, meine Spring-Konfiguration kann nicht richtig sein.

  • Im ersten Fall, mit dem @JsonFormat annotation, die Anfrage
    trifft der RESTful-Dienst, sondern wird ein NoSuchMethodError was darauf hindeutet
    meine Abhängigkeiten sind nicht korrekt.
  • Der zweite Fall, mit dem ContextResolver, die Anfrage ** nicht
    finden Sie die DispatcherServelet** (und daher nicht erreichen den Erholsamen
    Dienst). Dies deutet darauf hin meine Feder config ist falsch.

Wie gesagt, wenn ich nicht die @JsonFormat annotation oder der ContextResolver, die ich anrufen kann der RESTful-Dienst erfolgreich (aber ich muss die Formatierung der Termine).

Danke

Meine config wie folgt:

pom.xml

.
.
.
<jackson.version>2.8.0</jackson.version>
.
.
.
        <!-- JSON -->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-annotations</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-core</artifactId>
            <version>${jackson.version}</version>
        </dependency>
        <dependency>
            <groupId>com.fasterxml.jackson.datatype</groupId>
            <artifactId>jackson-datatype-jsr310</artifactId>
            <version>${jackson.version}</version>
        </dependency>

web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app version="3.1"
         xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         metadata-complete="false">

         <servlet>
            <servlet-name>rest</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <load-on-startup>1</load-on-startup>
         </servlet>

         <servlet-mapping>
            <servlet-name>rest</servlet-name>
            <url-pattern>/*</url-pattern>
         </servlet-mapping>

</web-app>

rest-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
                           http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
                           http://www.springframework.org/schema/context 
                           http://www.springframework.org/schema/context/spring-context-4.0.xsd
                           http://www.springframework.org/schema/mvc 
                           http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">

    <context:component-scan base-package="com.jobs.spring" />
    <mvc:annotation-driven />    
</beans>

Rest-Controller

@CrossOrigin(origins = {"*"})
@RestController
@RequestMapping(EmployeeRESTService.BASE_URI)
public class EmployeeRESTService {

    public static final String BASE_URI = "/employee";

    @Autowired
    private EmployeeService employeeService;

    @RequestMapping(value = "/list", method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_VALUE)
    public List<Employee> findAllEmployees() {
        return employeeService.findAll();
    }

    @RequestMapping(value = "/save", method = RequestMethod.POST, produces = MediaType.APPLICATION_JSON_VALUE, consumes = MediaType.APPLICATION_JSON_VALUE)
    public @ResponseBody String saveEmployee(@RequestBody Employee employee){
        Long id = employeeService.save(employee);
        return Long.toString(id);
    }
}
  • Was restful framework verwenden Sie? Frühjahr RestController oder Jersey? Können Sie auch nach dem code für die RestController oder Ressource-Klasse?
  • Hallo Wilson, vielen Dank für die Hilfe. Ich hatte Probleme mit jackson-datatype-jsr310 wie Sie sehen können, so haben auch schon versucht mit @XmlJavaTypeAdapter statt. Wenn es Ihnen nichts ausmacht, könnten Sie bitte einen Blick auf stackoverflow.com/questions/38335917/....
InformationsquelleAutor Richard | 2016-07-12
Schreibe einen Kommentar