2014-12-22 21 views
5

Yayında UTF8'i kullanmak için StringHttpMessageConverter DEFAULT_CHARSET'in üzerine yazmak için spring @ResponseBody iadesi her zaman utf-8 yapmaya çalışıyorum. Ama bunu çok uzun süre yapamam.Spring @

@RequestMapping(value="/test", method=RequestMethod.PUT) 
@ResponseBody 
public String ajaxTest() { 
    return "Characters test: ęółąśżźćń"; 
} 

Her cila karakter (ęółąśżźćń) ?

Ve web sayfasında bu dize alıyorum gider: Characters test: ?�??????? yerine Characters test: ęółąśżźćń

I basit metin cevabı iade ediyorum ne zaman Sorun geliyor Ne eksik olduğumu bilmiyorum.

ben şöyle gider public class WebAppConfig extends WebMvcConfigurerAdapter {} için custome fasulye ekledik:

@Bean 
public HttpMessageConverter<String> responseBodyConverter() { 
    StringHttpMessageConverter converter = new StringHttpMessageConverter(); 
    converter.setSupportedMediaTypes(Arrays.asList(new MediaType("text", "plain", Charset.forName("UTF-8")))); 
    return converter; 
} 

Talimat https://jira.spring.io/browse/SPR-9099

alınan Ama çalışmıyor. enter image description here


Bahar sürümü: 4.1.1.RELEASE

Web uygulaması yapılandırma sınıfı:

package com.derp.common.init; 

import java.nio.charset.Charset; 
import java.util.Arrays; 
import java.util.List; 
import java.util.Properties; 

import javax.annotation.Resource; 
import javax.sql.DataSource; 

import org.springframework.context.annotation.Bean; 
import org.springframework.context.annotation.ComponentScan; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.context.annotation.PropertySource; 
import org.springframework.core.env.Environment; 
import org.springframework.http.MediaType; 
import org.springframework.http.converter.HttpMessageConverter; 
import org.springframework.http.converter.StringHttpMessageConverter; 
import org.springframework.jdbc.datasource.DriverManagerDataSource; 
import org.springframework.orm.hibernate4.HibernateTransactionManager; 
import org.springframework.orm.hibernate4.LocalSessionFactoryBean; 
import org.springframework.transaction.annotation.EnableTransactionManagement; 
import org.springframework.web.servlet.config.annotation.ContentNegotiationConfigurer; 
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 com.derp.common.wicketView.HomePage; 

@Configuration 
@ComponentScan("com.derp") 
@EnableWebMvc 
@EnableTransactionManagement 
@PropertySource("classpath:application.properties") 
public class WebAppConfig extends WebMvcConfigurerAdapter { 

    private static final String PROPERTY_NAME_DATABASE_DRIVER = "db.driver"; 
    private static final String PROPERTY_NAME_DATABASE_PASSWORD = "db.password"; 
    private static final String PROPERTY_NAME_DATABASE_URL = "db.url"; 
    private static final String PROPERTY_NAME_DATABASE_USERNAME = "db.username"; 

    private static final String PROPERTY_NAME_HIBERNATE_DIALECT = "hibernate.dialect"; 
    private static final String PROPERTY_NAME_HIBERNATE_SHOW_SQL = "hibernate.show_sql"; 
    private static final String PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO = "hibernate.hbm2ddl.auto"; 
    private static final String PROPERTY_NAME_HIBERNATE_CONNECTION_CHARSET = "hibernate.connection.CharSet"; 
    private static final String PROPERTY_NAME_HIBERNATE_CONNECTION_CHARACTERENCODING = "hibernate.connection.characterEncoding"; 
    private static final String PROPERTY_NAME_HIBERNATE_CONNECTION_USEUNICODE = "hibernate.connection.useUnicode"; 
    private static final String PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN_SERVICES = "services.entitymanager.packages.to.scan"; 
    private static final String PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN_COMMON = "common.entitymanager.packages.to.scan"; 
    private static final String PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN_CMS = "cms.entitymanager.packages.to.scan"; 
    private static final String PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN_PROCEDURE = "procedure.entitymanager.packages.to.scan"; 

    @Resource 
    private Environment env; 

    @Bean 
    public DataSource dataSource() { 
     DriverManagerDataSource dataSource = new DriverManagerDataSource(); 
     dataSource.setDriverClassName(env.getRequiredProperty(PROPERTY_NAME_DATABASE_DRIVER)); 
     dataSource.setUrl(env.getRequiredProperty(PROPERTY_NAME_DATABASE_URL)); 
     dataSource.setUsername(env.getRequiredProperty(PROPERTY_NAME_DATABASE_USERNAME)); 
     dataSource.setPassword(env.getRequiredProperty(PROPERTY_NAME_DATABASE_PASSWORD)); 
     return dataSource; 
    } 

    @Bean 
    public LocalSessionFactoryBean sessionFactory() { 
     LocalSessionFactoryBean sessionFactoryBean = new LocalSessionFactoryBean(); 
     sessionFactoryBean.setDataSource(dataSource()); 
     //sessionFactoryBean.setPackagesToScan(env.getRequiredProperty(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN)); 
     sessionFactoryBean.setPackagesToScan(new String[] { 
       env.getRequiredProperty(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN_SERVICES), 
       env.getRequiredProperty(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN_COMMON), 
       env.getRequiredProperty(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN_CMS), 
       env.getRequiredProperty(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN_PROCEDURE) 
       }); 
     sessionFactoryBean.setHibernateProperties(hibProperties()); 
     return sessionFactoryBean; 
    } 

    private Properties hibProperties() { 
     Properties properties = new Properties(); 
     properties.put(PROPERTY_NAME_HIBERNATE_DIALECT, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_DIALECT)); 
     properties.put(PROPERTY_NAME_HIBERNATE_SHOW_SQL, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_SHOW_SQL)); 
     properties.put(PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_HBM2DDL_AUTO)); 
     properties.put(PROPERTY_NAME_HIBERNATE_CONNECTION_CHARSET, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_CONNECTION_CHARSET)); 
     properties.put(PROPERTY_NAME_HIBERNATE_CONNECTION_CHARACTERENCODING, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_CONNECTION_CHARACTERENCODING)); 
     properties.put(PROPERTY_NAME_HIBERNATE_CONNECTION_USEUNICODE, env.getRequiredProperty(PROPERTY_NAME_HIBERNATE_CONNECTION_USEUNICODE)); 
     properties.put("jadira.usertype.autoRegisterUserTypes", "true"); 
     return properties; 
    } 

    @Bean 
    public HibernateTransactionManager transactionManager() { 
     HibernateTransactionManager transactionManager = new HibernateTransactionManager(); 
     transactionManager.setSessionFactory(sessionFactory().getObject()); 
     return transactionManager; 
    } 


    @Override 
    public void configureContentNegotiation(ContentNegotiationConfigurer configurer) { 
     // Simple strategy: only path extension is taken into account 
     configurer.favorPathExtension(true). 
      ignoreAcceptHeader(true). 
      useJaf(false). 
      defaultContentType(MediaType.TEXT_HTML). 
      mediaType("html", MediaType.TEXT_HTML). 
      mediaType("xml", MediaType.APPLICATION_XML). 
      mediaType("json", MediaType.APPLICATION_JSON); 
    } 
    @Override 
    public void addResourceHandlers(ResourceHandlerRegistry registry) { 
     registry.addResourceHandler("/img/**").addResourceLocations("/WEB-INF/img/*"); 
     registry.addResourceHandler("/css/**").addResourceLocations("/WEB-INF/css/*"); 
     registry.addResourceHandler("/js/**").addResourceLocations("/WEB-INF/js/*"); 
     registry.addResourceHandler("/lib/**").addResourceLocations("/WEB-INF/lib/*"); 
    } 



    @Override 
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { 
     super.configureMessageConverters(converters); 
     converters.add(responseBodyConverter()); 
    } 
    @Bean 
    public HttpMessageConverter<String> responseBodyConverter() { 
     StringHttpMessageConverter converter = new StringHttpMessageConverter(); 
     converter.setSupportedMediaTypes(Arrays.asList(new MediaType("text", "plain", Charset.forName("UTF-8")))); 
     return converter; 
    } 
} 

Uygulama ben ateş ve değer döndürdü krom görebileceğiniz utf-8 olduğunu başlatıcı:

package com.derp.common.init; 

import java.nio.charset.Charset; 
import java.util.Arrays; 
import java.util.LinkedList; 
import java.util.List; 

import javax.servlet.ServletContext; 
import javax.servlet.ServletException; 
import javax.servlet.ServletRegistration.Dynamic; 

import org.springframework.http.MediaType; 
import org.springframework.http.converter.StringHttpMessageConverter; 
import org.springframework.web.WebApplicationInitializer; 
import org.springframework.web.context.ContextLoaderListener; 
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext; 
import org.springframework.web.filter.CharacterEncodingFilter; 
import org.springframework.web.filter.HiddenHttpMethodFilter; 
import org.springframework.web.servlet.DispatcherServlet; 

public class Initializer implements WebApplicationInitializer { 


    @Override 
    public void onStartup(ServletContext servletContext) throws ServletException { 
     AnnotationConfigWebApplicationContext ctx = new AnnotationConfigWebApplicationContext(); 
     ctx.register(WebAppConfig.class); 
     ctx.register(ThymeleafConfig.class); 
     servletContext.addListener(new ContextLoaderListener(ctx)); 

     ctx.setServletContext(servletContext); 

     Dynamic servlet = servletContext.addServlet("dispatcher", new DispatcherServlet(ctx)); 
     servlet.addMapping("/"); 
     servlet.setAsyncSupported(true);  
     servlet.setLoadOnStartup(1); 
     // Allow to use Put and Delete method for REST architecture 
     registerCharachterEncodingFilter(servletContext); 
     registerHiddenFieldFilter(servletContext); 
    } 


    private void registerCharachterEncodingFilter(ServletContext aContext) { 
     CharacterEncodingFilter cef = new CharacterEncodingFilter(); 
     cef.setForceEncoding(true); 
     cef.setEncoding("UTF-8"); 
     aContext.addFilter("charachterEncodingFilter", cef).addMappingForUrlPatterns(null ,true, "/*"); 
    } 
    private void registerHiddenFieldFilter(ServletContext aContext) { 
     aContext.addFilter("hiddenHttpMethodFilter", new HiddenHttpMethodFilter()).addMappingForUrlPatterns(null ,true, "/*"); 
    } 

} 

Java script/Jquery ajax call

$('h1').click(function() { 
     $.ajax({ 
      type: "PUT", 
      url: "/derp/procedury/test", 
      data: "none", 
      success: function (response, status, xhr) { 
       showNotifications(status, xhr.responseText); 
      }, 
      error: function (response, status, xhr) { 
       showNotifications('error', JSON.stringify(response)); 
       showNotifications('error', status); 
       showNotifications('error', xhr); 
      } 
     }); 
    }); 

Lütfen yardım edin.

+0

Yanıt gövdesini nasıl tüketiyorsunuz? –

+0

Sorunuzu anlamıyorum. Sorunuzu uzatabilir misiniz? – masterdany88

+0

'?????' yi nerede görüyorsunuz? Tarayıcıda görüyor musunuz? Bunu bir ajax yanıt işleyicisinde mi alıyorsunuz? –

cevap

5

Ağ sekmesi o HttpMessageConverter fasulye kayıtlı almıyor

converter.setSupportedMediaTypes(Arrays.asList(new MediaType("text", "plain", Charset.forName("UTF-8")))); 

Bu özel görünüyor olacak şekilde yapılandırılmış ne değildir hangi

text/html;charset=UTF-8 

gösteren gibi görünüyor.

@Override 
protected void configureMessageConverters(List<HttpMessageConverter<?>> converters) { 
    super.configureMessageConverters(converters); 
    converters.add(responseBodyConverter()); 
} 

Eğer yanıt tarayıcınızın ağ sekmesi UTF-8 gösterecekti neden

Content-Type:"text/plain;charset=UTF-8" 

ben açıklayamam içermelidir görmelisiniz ancak ayrıştırmak ya da işlemek için mümkün olmaz sizin WebAppConfig sınıfa Bunu ekle uygun şekilde. Benim için iyi çalışıyor.

+0

unfortunatelly olmasını bekliyorum. Ben olsun Hata: 'HTTP Durum 406 - tip Durum raporu mesajı açıklaması bu isteği tarafından tanımlanan bir kaynak talebi \ göre kabul edilemez özelliklere sahip yanıtları oluşturabilecek tek yeteneğine sahiptir headers.' "\ kabul" ve "", "status": 406, "statusText": "Kabul Edilemez"} ' yanıt hala:' İçerik-Tipi: 'text/html; charset = utf-8' ' – masterdany88

+0

Yaptım' configureMessageConverters 'public, derleme hatasının sebebi nedir? Bilmiyor musunuz? – masterdany88

+0

@ masterdany88' accept 'başlığınız her şeyi kabul eder.Bu hata olmamalıdır. Hangi derleme hatası? Lütfen sorunuzu düzenleyin ve tekrarlanabilir bir örnek sunun. le. Lütfen ayrıca Bahar versiyonunuzu da belirtiniz. –

1

Sorun şu ki, StringHttpMessageConverter varsayılanı ISO-8859-1'dir. Ya burada gösterildiği gibi UTF-8 varsayılan olarak ayarlamak gerekir:

@Bean 
    public HttpMessageConverter<String> responseBodyConverter() { 
     StringHttpMessageConverter converter = new StringHttpMessageConverter(StandardCharsets.UTF_8); 
     converter.setSupportedMediaTypes(Arrays.asList(new MediaType("text", "plain", Charset.forName("UTF-8")))); 
     return converter; 
    } 

Veya müşteri Accept başlık, yani tam olarak ne istediklerini belirtmek için olsun: Accept: text/plain;charset="UTF-8".