2017-05-08 78 views
0

那么,经过一个多星期的寻找答案,调试等我在这里寻求帮助。Spring Boot依赖关系DateTime序列化错误

案例:

我想,以显示与格式的LocalDateTime场 “YYYY-MM-dd'T'HH:MM:SS”,我读过有关支持包括jsr310当这种使用jackson-datatype-jsr310,但是依赖我得到这个异常抛出的任何地方有一个DateTime类型:

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; 

我读过,它与版本不兼容弹簧和jackson-datatype-jsr310所以我管理我所有的依赖与spring-boot-dependencies做;我甚至冲入神器的pom中,并有效地将jackson-datatype-jsr310列在那里,现在在您建议移除jsr310依赖关系之前,让我说我已经尝试过了,并且每当我这样做时,我都无法在我的ObjectMapper中注册JavaTimeModule,如果我没有注册模块,我会以非常规的方式(无格式,只有一个具有天数,分钟数年等属性的对象)序列化DateTime对象。我试过在ObjectMapper配置中使用不同的属性,没有任何东西可以摆脱那个错误,但是消除了jsr310的依赖关系,我也尝试了不同版本的依赖关系,没有任何作用。请帮助我。

的pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> 
    <modelVersion>4.0.0</modelVersion> 
    <groupId>com.faintness</groupId> 
    <artifactId>FaintnessOnlineStore</artifactId> 
    <packaging>war</packaging> 
    <version>1</version> 
    <name>FaintnessOnlineStore Maven Webapp</name> 
    <url>http://maven.apache.org</url> 

    <!-- PROPERTIES --> 
    <properties> 
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 
     <!-- <springsecurity.version>4.0.1.RELEASE</springsecurity.version>--> 
     <plugin.war.warName>${project.build.finalName}</plugin.war.warName> 
     <maven.test.skip>true</maven.test.skip> 
    </properties> 
    <dependencyManagement> 
     <dependencies> 
      <dependency> 
       <groupId>org.springframework.boot</groupId> 
       <artifactId>spring-boot-dependencies</artifactId> 
       <version>1.4.6.RELEASE</version> 
       <type>pom</type> 
       <scope>import</scope> 
      </dependency> 
     </dependencies> 
    </dependencyManagement> 

    <dependencies> 

     <dependency> 
      <groupId>javax.servlet</groupId> 
      <artifactId>javax.servlet-api</artifactId> 
      <version>3.1.0</version> 
     </dependency> 

     <!-- all spring security --> 
     <dependency> 
      <groupId>org.springframework.security</groupId> 
      <artifactId>spring-security-core</artifactId> 
      <!-- <version>${springsecurity.version}</version> --> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.security</groupId> 
      <artifactId>spring-security-web</artifactId> 
      <!-- <version>${springsecurity.version}</version> --> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework.security</groupId> 
      <artifactId>spring-security-config</artifactId> 
      <!-- <version>${springsecurity.version}</version> --> 
     </dependency> 

     <!-- basic spring --> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-orm</artifactId> 
      <!-- <version>4.3.7.RELEASE</version> --> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-beans</artifactId> 
      <!-- <version>4.3.7.RELEASE</version> --> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-aop</artifactId> 
      <!-- <version>4.3.7.RELEASE</version> --> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-expression</artifactId> 
      <!-- <version>4.3.7.RELEASE</version> --> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-core</artifactId> 
      <!-- <version>4.3.7.RELEASE</version> --> 
     </dependency> 
     <!-- spring web --> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-web</artifactId> 
      <!-- <version>4.3.7.RELEASE</version> --> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-webmvc</artifactId> 
      <!-- <version>4.3.7.RELEASE</version> --> 
     </dependency> 
     <dependency> 
      <groupId>org.springframework.mobile</groupId> 
      <artifactId>spring-mobile-device</artifactId> 
      <!-- <version>1.1.5.RELEASE</version> --> 
     </dependency>    
     <!-- mysql --> 
     <dependency> 
      <groupId>mysql</groupId> 
      <artifactId>mysql-connector-java</artifactId> 
      <version>5.1.39</version> 
     </dependency> 

     <!-- Serialization --> 
     <dependency> 
      <groupId>javax.validation</groupId> 
      <artifactId>validation-api</artifactId> 
      <version>1.1.0.Final</version> 
     </dependency> 

     <dependency> 
      <groupId>com.fasterxml.jackson.core</groupId> 
      <artifactId>jackson-databind</artifactId> 
      <!-- <version>${jackson.version}</version> --> 
     </dependency> 

     <dependency> 
      <groupId>com.fasterxml.jackson.datatype</groupId> 
      <artifactId>jackson-datatype-jsr310</artifactId> 
     </dependency> 

     <dependency> 
      <groupId>com.fasterxml.jackson.dataformat</groupId> 
      <artifactId>jackson-dataformat-csv</artifactId> 
      <!-- <version>${jackson.dataformat.csv.version}</version> --> 
     </dependency> 

     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-entitymanager</artifactId> 
      <!-- <version>3.6.8.Final</version> --> 
     </dependency> 

     <dependency> 
      <groupId>io.jsonwebtoken</groupId> 
      <artifactId>jjwt</artifactId> 
      <version>0.7.0</version> 
     </dependency> 

     <!-- JUnit --> 
     <dependency> 
      <groupId>junit</groupId> 
      <artifactId>junit</artifactId> 
      <version>4.12</version> 
     </dependency> 

     <dependency> 
      <groupId>org.springframework</groupId> 
      <artifactId>spring-test</artifactId> 
      <!-- <version>4.3.7.RELEASE</version> --> 
     </dependency> 

     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-validator</artifactId> 
      <!-- <version>5.2.4.Final</version> --> 
     </dependency> 

     <dependency> 
      <groupId>org.glassfish</groupId> 
      <artifactId>javax.el</artifactId> 
      <!-- <version>3.0.1-b08</version> --> 
     </dependency> 
     <!-- extra --> 
     <dependency> 
      <groupId>commons-validator</groupId> 
      <artifactId>commons-validator</artifactId> 
      <version>1.6</version> 
     </dependency> 

     <!-- Support for LocalDateTime and ZonedDateTime data conversion in SQL --> 
     <dependency> 
      <groupId>org.hibernate</groupId> 
      <artifactId>hibernate-java8</artifactId> 
      <!-- <version>5.0.4.Final</version> --> 
     </dependency> 


    </dependencies> 
    <build> 
     <finalName>FaintnessOnlineStore</finalName> 

     <!-- PLUGINS --> 
     <plugins> 
      <!-- configure WAR stuff etc --> 
      <plugin> 
       <groupId>org.apache.maven.plugins</groupId> 
       <artifactId>maven-war-plugin</artifactId> 
       <version>3.0.0</version> 
       <configuration> 
        <filteringDeploymentDescriptors>true</filteringDeploymentDescriptors> 
        <warName>${plugin.war.warName}</warName> 
       </configuration> 
      </plugin> 

      <!-- this is important!! --> 
      <plugin> 
       <artifactId>maven-compiler-plugin</artifactId> 
       <version>3.5.1</version> 
       <configuration> 
        <source>1.8</source> 
        <target>1.8</target> 
       </configuration> 
      </plugin> 
      <!-- jboss plugin important too!! --> 
      <plugin> 
       <groupId>org.jboss.as.plugins</groupId> 
       <artifactId>jboss-as-maven-plugin</artifactId> 
       <version>7.9.Final</version> 
       <configuration> 
        <filename>${project.artifactId}-${project.version}.ear</filename> 
        <port>8999</port> <!-- you change it following what you have on your server config --> 
        <filename>${plugin.war.warName}.${project.packaging}</filename> 

       </configuration> 
      </plugin> 

     </plugins> 
    </build> 
</project> 

ObjectMapper

package com.pier.config; 

import org.springframework.stereotype.Component; 

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

@Component 
public class SpecObjectMapper extends ObjectMapper{ 

    public SpecObjectMapper(){ 
     registerModule(new JavaTimeModule()); 
     configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS,true) 
     .configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false) 
     .disable(DeserializationFeature.ADJUST_DATES_TO_CONTEXT_TIME_ZONE);    


    } 

} 

WebConfiguration

package com.pier.config; 

import java.util.List; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.annotation.ImportResource; 
import org.springframework.context.annotation.PropertySource; 
import org.springframework.http.converter.HttpMessageConverter; 
import org.springframework.http.converter.json.MappingJackson2HttpMessageConverter; 
import org.springframework.mobile.device.DeviceWebArgumentResolver; 
import org.springframework.mobile.device.site.SitePreferenceWebArgumentResolver; 
import org.springframework.web.method.support.HandlerMethodArgumentResolver; 
import org.springframework.web.servlet.config.annotation.EnableWebMvc; 
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry; 
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter; 
import org.springframework.web.servlet.mvc.method.annotation.ServletWebArgumentResolverAdapter; 

@EnableWebMvc 
@Configuration 
@ComponentScan(basePackages={"com.pier.controllers.*", "com.pier.config, com.pier.model.security", "com.pier.rest,com.pier.security.*"}) 
public class WebConfiguration extends WebMvcConfigurerAdapter { 

    @Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) { 
     registry 
      .addResourceHandler("/pages/**") 
      .addResourceLocations("/pages/"); 
    } 

    @Override 
    public void addArgumentResolvers(
     List<HandlerMethodArgumentResolver> argumentResolvers) { 

     // Adding Spring mobile argument resolvers 
     argumentResolvers.add(
      new ServletWebArgumentResolverAdapter(
       new DeviceWebArgumentResolver())); 

     argumentResolvers.add(
      new ServletWebArgumentResolverAdapter(
       new SitePreferenceWebArgumentResolver())); 

    } 

    @Autowired 
    SpecObjectMapper domainMapper; 

    @Override 
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) 
    { 
     MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); 
     converter.setObjectMapper(domainMapper); 
     converters.add(converter); 
     super.configureMessageConverters(converters); 
    } 
} 

实体连载

@Entity 
@Table(name="PROMOTION") 
public class Promotion implements ObjectModel<Long>{ 

    @Id 
    @GeneratedValue(strategy=GenerationType.IDENTITY) 
    private Long id; 

    @Column(name="DISPLAY_NAME",length=30) 
    @Size(min=5,max=30) 
    private String displayName; 

    @Column(name = "START_DATE")  
    @Type(type="org.hibernate.type.ZonedDateTimeType")  
    private ZonedDateTime startDate; 


    @Column(name = "END_DATE") 
    @Type(type="org.hibernate.type.ZonedDateTimeType") 
    private ZonedDateTime endDate; 

更新: 我得到了另一条线索,并得到这个在控制台上:ModuleClassLoader for Module "com.fasterxml.jackson.core.jackson-databind:main" from local module loader @15b3e5b (finder: local module finder @61ca2dfa (roots: C:\Users\PC\EAP-7.0.0\modules,C:\Users\PC\EAP-7.0.0\modules\system\layers\base))

所以,现在我知道这是怎么回事,该版本是在JBoss的模块已经过时,我需要排除它或找到一种方法从我的类路径而不是模块加载它。

回答

1

好吧我终于明白了,这要感谢Jboss文档和这个答案:How to exclude Jackson on WildFly 9,我希望这有助于防止有人遇到同样的问题。 (这是在Jboss EAP 7上,我认为他们应该升级他们的杰克逊版本)

请参阅Class loading and Modules Jboss EAP 7关于3.4节以排除模块。我的jboss部署结构如下所示:

<deployment> 
    <exclusions> 
    <module name="com.fasterxml.jackson.core.jackson-core" /> 
    <module name="com.fasterxml.jackson.core.jackson-databind" /> 
    <module name="com.fasterxml.jackson.jaxrs.jackson-jaxrs-json-provider" /> 
    <module name="org.jboss.resteasy.resteasy-jackson2-provider" /> 
    </exclusions> 
</deployment> 
相关问题